segue.identifier = 在第二个视图中为零

segue.identifier = nil in second view

我有 IOS Swift 程序,使用 Storyboards 和 NavigationController。 有两个View,我们称它们为mainView,secondView。

从 mainView 我有 BarButtonItem 转到 secondView。按下该按钮时,它会触发 mainView 中的 prepareForSegue 函数 segue.identifier = "secondView"

当我打开例如第二个视图,我有两个用于取消和保存的 BarButtonItems。当按下其中任何一个时,该视图中的 prepareForSegue 函数被触发,但现在 segue.identifier = nil.

我希望 segue.identifier = "cancel" 或 "save" 取决于在该视图中按下的按钮。

我是不是误解了 segue 功能?任何人都可以尝试就此启发我,因为这看起来像是情节提要和导航中非常重要且有用的部分 - 但不知何故我没有做对。

您是否为第二个视图中的取消和保存按钮创建了操作? 右键单击并从故事板拖动到视图控制器代码和下拉列表中的 select 操作。

然后在 action 方法中,执行你的 segue。

@Garret、@rdelmar、@syed-tariq - 感谢您为我指明正确的方向。

原来是 Unwind Segue 让我走上了正轨:Xcode Swift Go back to previous viewController (TableViewController)

但我还发现我在故事板中犯了一个错误,因为我在所有视图上都有导航控制器(是的,我知道 - 愚蠢的当你知道得更多):

最后一个难题是了解 Protocols and Deligates 让这一切正常工作。

综上所述,简而言之:

  1. 我在第二个视图中创建了一个协议(在 class 之上)

    protocol MyDelegate: class {
        func getMyList(sender: MySecondView) -> [NSManagedObject]  //returns a CoreData list
    }
    
  2. 然后我在第二个视图中创建了一个委托变量

    weak var datasource: MyDelegate!
    
  3. 在我的第一个视图中,我实现了协议,这只是一个简单的函数,返回我在第二个视图中需要的列表

  4. 在我的第一个视图中,我有 prepareForSegue,在那里我捕获了正确的 segue.identifier,然后我通过 segue.destinationViewController 设置委托,就像这样

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
        if segue.identifier == "mySegue" {
            let vc = segue.destinationViewController as! MySecondView
            vc.delegate = self
        }
    }
    

就是这样 - 现在神奇的是流程是正确的,segues 发生了,delegates 正确地通过了,一切都很好:)