通过根视图控制器传递对象

时间:2016-07-01 19:46:09

标签: ios swift swift2 segue

我有一个以编程方式创建的rightBarButtonItem,我想触发一个模态segue到导航控制器。导航控制器是我的编辑视图控制器场景的“根视图控制器”。

这是一个example of what I'm talking about,除了这里按钮是在故事板中创建的,因此你可以控制 - 从故事板中的按钮拖动segue。这是我正在谈论的结构

HomeVC --(modal)--> Navigation Controller --(root view)--> EditVC

我无法在故事板中插入rightBarButtonItem,因此我必须以编程方式创建一个made the segue to the Navigation Controller following this answer

我的目的是提供一个模态屏幕来编辑一个对象,所以我需要将该对象从我的HomeVC传递到我的EditVC通过导航控制器。第一个链接中的示例是创建一个对象,因此无需传递任何内容。

这就是我现在的位置。我的HomeVC(简化名称以便于理解)有一个带有编程创建的rightBarButtonItem的导航栏,其选择器调用一个函数:

func editButtonPressed() {
    // doesn't call prepareForSegue unless I prepend super.
    super.performSegueWithIdentifier("ShowEdit", sender: self)     
}

我的麻烦在于我的prepareForSegue函数:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    print("this one prints")
    if segue.identifier == "ShowEdit" {
        print("this one prints")
        // prints out the UINavigationController, not the EditVC
        print("segue: \(segue.destinationViewController)")
        if let editViewController = segue.destinationViewController as? EditViewController {
            // THIS IS WHAT I WANT TO ACCOMPLISH
            editViewController.selectedObject = selectedObject
            print("DOES NOT PRINT")
        } else {
            print("this one prints")
        }
    }

因此,如果你能看到我所得到的,我想将对象从HomeVC传递给EditVC,但我的segue目前正在转向导航根视图控制器。如何通过导航控制器将其传递给EditVC?

我考虑过为Nav Controller创建一个控制器,所以它是myNavVC.selectedObject == selectedObject,然后在myNavVC的prepareForSegue中用EditVC.selectedObject == selectedObject传递它,但是我会用它作为标识符根视图?

1 个答案:

答案 0 :(得分:3)

在Objective-C中演示:

UINavigationController *navigationController = (UINavigationController*)segue.destinationViewController;

EditViewController *editViewController = (EditViewController *)[[navigationController viewControllers] firstObject];

editViewController.selectedObject = selectedObject;

Swift中的演示:

if let navigationController = segue.destinationViewController as? UINavigationController {
    if let editViewController = navigationController.viewControllers.first as? EditViewController {
                editViewController.selectedObject = selectedObject
    }
}