您可以按照您描述的方式进行操作,或者在您要从中展开的 viewController 中使用 prepareForSegue 覆盖函数:
@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}
或者...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}
第一个例子正如你所描述的那样。按钮连接到 unwind segue 和 Interface Builder 中的按钮操作。按钮动作将在 segue 动作之前触发。也许您没有将操作连接到界面生成器中的按钮?
第二个示例让您可以访问 segue 的 sourceViewController 和 destinationViewController,以防万一也有用(您也可以在目标视图控制器的展开 segue 函数中获得这些)。
如果您想延迟展开转场直到按钮的本地操作完成,您可以使用self.performSegueWithIdentifier(或遵循 wrUS61 的建议)直接从按钮操作中调用转场(而不是将其连接到情节提要中)
编辑
您似乎怀疑是否可以通过将按钮连接到展开转场和按钮操作来解决此问题。我已经建立了一个这样的小测试项目:
class BlueViewController: UIViewController {
@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}
}
class RedViewController: UIViewController {
@IBAction func unwindToRed(sender: UIStoryboardSegue) {
println("unwindToRed");
}
}
BlueViewController 有一个按钮,它在情节提要中连接到 unwindToRed unwind segue 和 actionForUnwindButton 按钮。它还覆盖了prepareForSegue,因此我们可以记录播放顺序。
输出:
actionForUnwindButton
prepareForSegue
unwindToRed
故事板:
编辑 2
您的演示项目显示此不工作。不同之处在于您使用 barButtonItem 来触发操作,而我使用的是常规按钮。 barButtonItem 失败,而常规按钮成功。我怀疑这是由于消息传递顺序的不同(以下是推测,但符合观察到的行为):
(A) 视图控制器中的 UIButton
ViewController 的按钮接收 touchupInside
- (1) 向它的方法发送动作
- (2) 将 segue 展开动作发送到故事板 segue
收到的所有消息,以及按此顺序执行的方法:
actionForUnwindButton
prepareForSegue
unwindToRed
(B) 导航控制器工具栏中的 UIBarButtonItem
工具栏buttonItem接收touchupInside
- (1) 将 segue 展开动作发送到故事板 segue
- (2) (可能) 向 viewController 的方法发送动作
执行顺序是
prepareForSegue
unwindToRed
actionForUnwindButton
prepareForSegue 和 unwind 收到消息。然而,actionForUnwindButton 消息被发送到 nil,因为 viewController 在 segue 期间被销毁。所以它没有被执行,并且日志打印
prepareForSegue
unwindToRed
在(B)的情况下,viewController在方法到达之前就被销毁了,所以不会被触发
看来你的选择是……
(a) 使用带有动作的 UIButton 并展开 segue
(b) 使用prepareForSegue 触发您的操作,这将在 viewController 还活着的时候触发,并且在 segue 发生之前。
(c) 不要使用 unwind segue,只需使用按钮操作。在 action 方法中,您可以通过在导航控制器上调用 popToViewController 来“放松”。
顺便说一句,如果你在 viewController 上实现了一个 toolBar(不使用导航控制器的工具栏),结果是一样的:segue 首先被触发,所以按钮操作失败。