GVKun编程网logo

如何在 Swift 中关闭 ViewController?(swiftui navigationview)

2

在本文中,我们将详细介绍如何在Swift中关闭ViewController?的各个方面,并为您提供关于swiftuinavigationview的相关解答,同时,我们也将为您带来关于iOSSwiftw

在本文中,我们将详细介绍如何在 Swift 中关闭 ViewController?的各个方面,并为您提供关于swiftui navigationview的相关解答,同时,我们也将为您带来关于iOS Swift window.rootViewController vs presentViewController、ios – Swift playground:获取ViewController以调用presentViewController、ios – Swift – 如何从ViewController中按下UItableViewCell中的动作按钮?、ios – Swift:类型’ViewController’不符合协议’UIPageViewControllerDataSource’的有用知识。

本文目录一览:

如何在 Swift 中关闭 ViewController?(swiftui navigationview)

我试图通过dismissViewController调用IBAction

  @IBAction func cancel(sender: AnyObject) {    self.dismissViewControllerAnimated(false, completion: nil)    println("cancel")}@IBAction func done(sender: AnyObject) {    self.dismissViewControllerAnimated(false, completion: nil)    println("done")}

segue 的随机图像

我可以在控制台输出中看到 println 消息,但 ViewController 永远不会被解雇。可能是什么问题呢?

答案1

小编典典

从您的图像看来,您似乎使用 push 呈现了 ViewController

dismissViewControllerAnimated用于关闭使用模态呈现的ViewController

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)dismiss(animated: true, completion: nil)

iOS Swift window.rootViewController vs presentViewController

iOS Swift window.rootViewController vs presentViewController

在多个视图之间切换的最佳做法是什么?更改rootViewController或使用模态视图?

设置rootviewController:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
var vc : UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as TargetViewController
var window :UIWindow = UIApplication.sharedApplication().keyWindow!
window.rootViewController = vc;
window.makeKeyAndVisible()

更改模态视图:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as TargetViewController
self.presentViewController(initViewController,animated: false,nil)

当我需要向用户呈现其他视图时,我很困惑.

附:就我而言,我的应用程序以登录表单作为rootViewController开始.登录后,我认为最好更改rootViewController,但我是对的吗?

解决方法

我的建议是,而不是困扰很多,你只需要覆盖rootviewController剩下的东西由你的应用程序照顾.

let storyBoard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
    let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as TargetViewController
    self.window?.rootViewController? = initViewController

在这段代码中,我们只是从AppDelegate覆盖了rootview控制器.

ios – Swift playground:获取ViewController以调用presentViewController

ios – Swift playground:获取ViewController以调用presentViewController

我想在Playground玩UIAlertController.是否有可能从XCPlaygroundPage获取ViewController – 能够调用presentViewController?

解决方法

是的,你当然可以获得一个视图控制器,但因为没有“附加”视图控制器,你最终会看到如下警告:

不鼓励在分离的视图控制器上呈现视图控制器

在我的情况下,警报控制器在屏幕上超短暂闪烁,然后消失.也许你可以稍微提高一点吗?

无论如何,这是我在操场上创建视图控制器的方式:

import UIKit
import XCPlayground

class RootViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0,y: 0,width: 350,height: 420)
        self.view.backgroundColor = UIColor.redColor()
    }
}

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    var tableView: UITableView!
    let items = ["Hello 1","Hello 2","Hello 3"]
    var alertController : UIAlertController? {
        didSet {
            if alertController == nil {
                print("alertController set to nil")
            } else {
                print("alertController set to \(alertController)")
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0,width: 320,height: 480)
        self.tableView = UITableView(frame:self.view.frame)
        self.tableView!.dataSource = self
        self.tableView!.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell")
        self.view.addSubview(self.tableView)

    }
    func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int{
        return self.items.count;
    }

    func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCellWithIdentifier("cell",forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = "\(self.items[indexPath.row])"
        return cell
    }

    override func viewDidAppear(animated: Bool) {
        alertController = UIAlertController.init(title: "My Title",message: "Testing in Playground",preferredStyle: .Alert)

        let okAction = UIAlertAction(title: "Ok",style: .Default) { (_) -> Void in
            // Some action here
            print("hit okay button")
        }

        alertController!.addAction(okAction)

        ctrl.presentViewController(alertController!,animated: false,completion: {
            print("done presenting")
        })
    }
}

var ctrl = ViewController()
var rootVC = RootViewController()
rootVC.addChildViewController(ctrl)
rootVC.view.addSubview(ctrl.view)
XCPlaygroundPage.currentPage.liveView = rootVC.view

而我在这里做的是创建一个“根视图控制器”,添加一个带有表的子视图控制器(试图让一些视图控制器“附加”到其他东西)然后我试图呈现一个警报控制器在那.

ios – Swift – 如何从ViewController中按下UItableViewCell中的动作按钮?

ios – Swift – 如何从ViewController中按下UItableViewCell中的动作按钮?

参见英文答案 > Issue Detecting Button cellForRowAt                                    3个
>             swift: how to get the indexpath.row when a button in a cell is tapped?                                    14个
我在UITableViewCell中有一个操作按钮,我想检测按钮的按下时间以及ViewController中按下的单元格编号,以便在ViewController.swift中创建音频播放列表.

我已经陷入这个问题一段时间了,我真的很赞赏你的建议.这是代码.

ViewController.swift

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        tableView.register(UINib(nibName: "Cell",bundle: nil),forCellReuseIdentifier: "cell")

    }

    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! Cell
        return cell

    }


}

Cell.swift

import UIKit

class Cell: UITableViewCell {

    @IBOutlet weak var button: UIButton!

    @IBAction func buttonpressed(_ sender: Any) {

        ***[Code to send the pressed cell's number to ViewController]***

    }

}

解决方法

你可以选择一个老式的代表模式.这样做的好处是不会将视图控制器与单元格耦合.不要忘记让你的代表弱,以避免保留周期.

您可以从表视图中找到单元索引路径. (我假设按单元格编号表示索引路径)

protocol CellDelegate: class {
    func didTap(_ cell: Cell)
}

class Cell: UITableViewCell {

    weak var delegate: CellDelegate?
    @IBAction func buttonpressed(_ sender: Any) {
        delegate?.didTap(self)
    }
}

class ViewController: UIViewController,CellDelegate {

    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ...
        cell.delegate = self
        return cell
    }

    func didTap(_ cell: Cell) {
        let indexPath = self.tableView.indexPath(for: cell)
        // do something with the index path
    }
}

ios – Swift:类型’ViewController’不符合协议’UIPageViewControllerDataSource’

ios – Swift:类型’ViewController’不符合协议’UIPageViewControllerDataSource’

我正在使用 Xcode 6 GM.我正在尝试实现这个 page view controller tutorial但是在Swift中而不是Objective-C但它没有按预期工作.

我实际上设法找到了其他人正在做同样的git repo,但是在克隆他们的项目并在Xcode中打开它之后,我遇到了同样的错误.在实现UIPageViewControllerDataSource协议时,除了协议一致性问题之外,我已经设法解决了大部分问题.

说实话,我不完全明白其用法?而且!在斯威夫特,如果这是导致我的问题.删除!从协议的方法实现中的变量引起其他错误.

有人可以帮忙吗?

class ViewController: UIViewController,UIPageViewControllerDataSource {

var pageViewController : UIPageViewController?
var pageTitles = ["Over 200 Tips and Tricks","discover Hidden Features","Bookmark Favorite Tip","FreeRegular Update"]
var pageImages = ["page1.png","page2.png","page3.png","page4.png"]
var currentIndex = 0

@IBAction func startWalkthrough(sender: UIButton) {
    var startingViewController : PageContentViewController = self.viewControllerAtIndex(0)!
    var viewControllers : NSArray = [startingViewController]
    self.pageViewController!.setViewControllers(viewControllers,direction: .Forward,animated: false,completion: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()

    //Create page view controller
    self.pageViewController = UIPageViewController(transitionStyle: .Scroll,navigationorientation: .Horizontal,options: nil)
    self.pageViewController!.dataSource = self

    let startingViewController : PageContentViewController = self.viewControllerAtIndex(0)!
    let viewControllers: NSArray = [startingViewController]
    self.pageViewController!.setViewControllers(viewControllers,completion: nil)

    // Change the size of page view controller
    self.pageViewController!.view.frame = CGRectMake(0,self.view.frame.size.width,self.view.frame.size.height - 30);

    self.addChildViewController(self.pageViewController!)
    self.view.addSubview(self.pageViewController!.view)
    self.pageViewController!.didMovetoParentViewController(self)

}

func pageViewController(pageViewController: UIPageViewController!,viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {

        var index = (viewController as PageContentViewController).pageIndex

        if index == 0 || index == NSNotFound {
            return nil
        }

        index!--

        println("Decreasing Index: \(index)")

        return self.viewControllerAtIndex(index!)
}

func pageViewController(pageViewController: UIPageViewController!,viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {

        var index = (viewController as PageContentViewController).pageIndex

        if index == NSNotFound {
            return nil
        }

        index!++

        println("Increasing Index: \(index)")

        if index == self.pageTitles.count {
            return nil;
        }
        return self.viewControllerAtIndex(index!);
}

func viewControllerAtIndex(index : Int) -> PageContentViewController? {

    if self.pageTitles.count == 0 || index >= self.pageTitles.count {
        return nil;
    }

    // Create a new view controller and pass suitable data.
    let pageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController
    pageContentViewController.imageFile = self.pageImages[index]
    pageContentViewController.titleText = self.pageTitles[index]
    pageContentViewController.pageIndex = index

    return pageContentViewController;
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return self.pageTitles.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 0
}
}

解决方法

这是因为UIPageViewControllerDataSource协议具有更新的方法签名 – 您正在使用:
func pageViewController(pageViewController: UIPageViewController!,viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController!

func pageViewController(pageViewController: UIPageViewController!,viewControllerAfterViewController viewController: UIViewController!) -> UIViewController!

但现在它们是:

func pageViewController(pageViewController: UIPageViewController,viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?

func pageViewController(pageViewController: UIPageViewController,viewControllerAfterViewController viewController: UIViewController) -> UIViewController?

当您对不符合协议有疑问时,命令单击协议名称将带您进入协议声明,您可以在其中查看是否正确实现其接口

今天关于如何在 Swift 中关闭 ViewController?swiftui navigationview的介绍到此结束,谢谢您的阅读,有关iOS Swift window.rootViewController vs presentViewController、ios – Swift playground:获取ViewController以调用presentViewController、ios – Swift – 如何从ViewController中按下UItableViewCell中的动作按钮?、ios – Swift:类型’ViewController’不符合协议’UIPageViewControllerDataSource’等更多相关知识的信息可以在本站进行查询。

本文标签: