【问题标题】:Passing an object through a root view controller通过根视图控制器传递对象
【发布时间】:2016-11-04 07:29:15
【问题描述】:

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

这是一个example of what I'm talking about,除了这里的按钮是在情节提要中创建的,因此您可以从情节提要中的按钮控制并拖动转场。这就是我说的结构

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?

我想为导航控制器创建一个控制器,所以它会是myNavVC.selectedObject == selectedObject,然后在 myNavVC 的 prepareForSegue 中使用EditVC.selectedObject == selectedObject 传递它,但是由于它是根视图,我将使用什么作为标识符?

【问题讨论】:

  • 你确定destVC是editVC吗?
  • 所以现在 destVC 是导航控制器,它是 editVC 的根视图,这就是它不进入 if let editViewController... 的原因。请参阅我的最后一段了解我想要做什么,但不知道如何做。

标签: ios swift swift2 segue


【解决方案1】:

在 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
    }
}

【讨论】:

  • 刚开始iOS编程,只用过Swift,所以不知道Objective-C的语法,所以不清楚第二行是怎么回事[[navigationController viewControllers] firstObject]
  • 看起来很有效,谢谢! @pacification 我将他的代码实现为` if let navigationController = segue.destinationViewController as? UINavigationController { if let editViewController = navigationController.viewControllers.first as? EditViewController { editViewController.selectedObject = selectedObject } }` 摆脱强制展开,你觉得好看吗?
  • 对不起@Proton,你发布了正确的答案,但是,Tommy K,你应该用if let ...guard ... 解包
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 2015-12-23
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多