Swift - 如何传递UInavigationController并传递变量

时间:2016-09-07 17:49:33

标签: swift

传递UInavigationController并将变量传递给新的viewController的最佳方法是什么。我知道如何做一个或另一个但不能同时做两个。提前谢谢

这是我目前的代码

func(){

       let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController
        let posts = self.postList[indexPath.row]

        //this is the var that i want to past
       //vc.previousViewMessageId = posts.postKey

        self.presentViewController(vc, animated: true, completion: nil)


}

3 个答案:

答案 0 :(得分:0)

要将值传递给导航控制器的根视图控制器,您可以访问viewControllers[0]并将其强制转换为消息视图控制器(具有previousViewMessageId属性的控制器)的类:

func () {
    let messagesNC = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController
    let messagesVC = messagesNC.viewControllers.first as! MessagesViewController

    messagesVC.previousViewMessageId = postList[indexPath.row].postKey

    presentViewController(messagesNC, animated: true, completion: nil)
}

答案 1 :(得分:0)

如果我理解正确,你有一个可以呈现第二个VC的视图控制器。此VC嵌入在UINavigationController中。您不知道该怎么做,是将数据从第一个VC传递到导航控制器,然后传递到第二个VC。

这是一个强力解决方案。它不漂亮,但它无论如何都有效。

制作自己的UINavigationController子类:

class DataPasserController: UINavigationController {
    var previousViewMessageId: SomeType?
    override func viewDidLoad() {
        if let vc = self.topViewController as? YourSecondViewController {
            vc.previousViewMessageId = self.previousViewMessageId
        }
    }
}

现在,您可以在故事板中添加导航控制器,将其类设置为DataPasserController,并将第二个VC作为其根视图控制器连接到它。

现在假设您通过调用DataPasserController获得了instantiateViewControllerWithIdentifier的实例,您可以这样做:

yourDataPasserControllerInstance.previousViewMessageId = posts.postKey

并呈现实例!

答案 2 :(得分:0)

你所拥有的只是呈现一个视图控制器......你正在跳过导航控制器。

您需要做的是在导航控制器中显示新的视图控制器。完成后,它将正确显示。您还可以在创建vc变量后传递变量。

这在导航控制器中提供了新的viewController(vc)......

self.navigationController?.pushViewController(vc, animated: false)

这在新的viewController中设置变量(vc)(你是对的)

vc.previousViewMessageId = posts.postKey

如此完整:

func(){

    let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! MessagesViewController
    let posts = self.postList[indexPath.row]

    //this is the var that i want to past
    vc.previousViewMessageId = posts.postKey

    navigationController?.pushViewController(vc, animated: false)
}

PS。虽然不是问题的一部分,但我觉得我仍然应该提到...... self这个词的使用应该只是必要的。换句话说,在不需要时不要使用它。例如self.postList[indexPath.row] :) https://github.com/raywenderlich/swift-style-guide#use-of-self