Swift:使用导航控制器prepareForSegue

时间:2015-02-28 23:55:04

标签: ios swift uinavigationcontroller

我正在Swift中开发一个iOS应用程序。

我想使用prepareForSegue函数将视图中的数据发送到另一个视图。

但是,我的目标视图前面是导航控制器,所以它不起作用。

我该怎么办呢?

8 个答案:

答案 0 :(得分:116)

prepareForSegue中访问目标导航控制器,然后访问其顶部:

let destinationNavigationController = segue.destination as! UINavigationController
let targetController = destinationNavigationController.topViewController

您可以从目标控制器访问其视图并传递数据。

在旧的 - 现在已经过时 - 版本的Swift和UIKit中,代码略有不同:

let destinationNavigationController = segue.destinationViewController as UINavigationController
let targetController = destinationNavigationController.topViewController

答案 1 :(得分:25)

假设您要将数据从SendViewController发送到ReceiveViewController:

  1. 将其添加到SendViewController

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "segueShowNavigation"{
        var DestViewController = segue.destinationViewController as! UINavigationController
        let targetController = DestViewController.topViewController as! ReceiveViewController
        targetController.data = "hello from ReceiveVC !"
    }}
    
  2. 将标识符segue编辑为" showNavigationController"

  3. screenshot

    1. 在您的ReceiveViewController中添加
    2. var data : String = ""
      
      override func viewDidLoad() {
          super.viewDidLoad()
          print("data from ReceiveViewController is \(data)")
      }
      

      当然你可以发送任何其他类型的数据(int,Bool,JSON ......)

答案 2 :(得分:14)

使用optional binding和Swift 3&完成答案4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let navigationVC = segue.destination as? UINavigationController, let myViewController = navigationVC.topViewController as? MyViewControllerClass {
        myViewController.yourProperty = myProperty
    }
}

答案 3 :(得分:4)

以下是Swift 3的答案:

let svc = segue.destination as? UINavigationController

let controller: MyController = svc?.topViewController as! MyController
controller.myProperty = "Hi there"

答案 4 :(得分:3)

Swift 3中的一个班轮:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if let vc = segue.destination.childViewControllers[0] as? FooController {
    vc.variable = localvariable
  }
}

答案 5 :(得分:1)

在Swift 5中

如果您不仅必须从SourceViewController选择到嵌入在UINavigationController中的DestinationViewController,而且还选择到新的Storyboard,则请执行以下操作...

  1. 在Interface Builder中,将对象库中的“ Storyboard Reference”对象放置在源ViewController旁边,然后将序列拖到该对象上(例如,从SourceViewController视图上的按钮)。例如,将segue标识符命名为“ ToOtherStoryboard”。

  2. 转到NavigationViewController并使用Identity Inspector为它提供一个Storyboard ID。 “ DestinationNavVC”可以。

  3. 单击在步骤1中创建的Storyboard Reference图标,然后在其属性检查器的“ Referenced ID”字段中,输入您在步骤2中为UINavigationController编写的Storyboard ID。这将创建从源到DestinationViewController的序列。无论您在源ViewController的源文件中写入什么内容。这是因为设置到NaviationController会自动显示UINavigationController的根ViewController(第一个)。

  4. (可选)如果您需要将数据与segue一起附加并发送到DestinationViewController中的属性,则可以在SourceViewController文件的Prepare-For-Segue方法内编写以下代码:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ToOtherStoryboard" {
            let destinationNavVC = segue.destination as! UINavigationController
            let destinationVC = destinationNavVC.topController as!     DestinationViewController
    
            destinationVC.name = nameTextField.text // for example
            destinationVC.occupation = occupationTextField.text
        }
    }
    

    如果您只是想从一个ViewController移到另一个ViewController,则无需使用PrepareForSegue,上面的方法将起作用(不执行步骤3)

  5. 在用于启动segue的按钮的IBAction Outlet方法中,您将编写:

    performSegue(withIdentifer: "ToOtherStoryboard", sender: self)
    

答案 6 :(得分:1)

跳过UINavigationController的检查是个好主意,因为可能有多个segues使用navigationController,因此每检查segue都会检查该检查使用navigationController。更好的方法是检查viewController中的第一个children并将其转换为您要查找的viewController

if let destVC = segue.destination.children.first as? MyViewController {
    destVC.hideBottomBar = true
}

答案 7 :(得分:0)

在segue arrow属性中设置标识符名称,以便在performeSegue中使用。

赞:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let vc: ProfileViewController = segue.destination as? ProfileViewController {

        //do any setting to the next screen

    }

}

然后:

    performSegue(withIdentifier: "yourIdentifierOfViewProfile", sender: indexPath.row)

希望对您有帮助。