在解除segue行动之前该怎么办?

Mec*_*nic 16 ios swift unwind-segue

我刚刚想出了什么是一个放松的segue以及如何使用它与这个问题的好答案.非常感谢.

但是,这是一个像这样的问题:

假设在场景B中有一个按钮可以展开到场景A的一个按钮,在它被分割之前我想要做一些事情,比如将数据保存到数据库.我在B.swift中为这个按钮创建了一个动作,但它似乎直接进入了场景A而没有采取指定的动作.

谁知道为什么或如何做到这一点?

谢谢.

fou*_*dry 21

您可以按照描述的方式执行此操作,也可以prepareForSegue在要从中展开的viewController中使用覆盖函数:

@IBAction func actionForUnwindButton(sender: AnyObject) {
    println("actionForUnwindButton");
}
Run Code Online (Sandbox Code Playgroud)

要么...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    println("prepareForSegue");
}
Run Code Online (Sandbox Code Playgroud)

第一个例子就像你描述的那样.该按钮连接到展开segue和Interface Builder中的按钮操作.在segue动作之前将触发按钮动作.也许您没有将操作连接到界面构建器中的按钮?

第二个例子让你有机会获得SEGUE的sourceViewController,并destinationViewController在情况下也很有用(你也可以得到这些在目的地视图控制器开卷SEGUE的功能).

如果你想延迟解开segue直到按钮的本地动作完成,你可以直接从按钮动作调用segue(而不是在故事板中将它挂钩)self.performSegueWithIdentifier(或者按照wrUS61的建议)

编辑

你似乎对是否可以通过将按钮连接到展开segue和按钮动作来解决这个问题.我已经建立了一个像这样的小测试项目:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

BlueViewController有一个按钮,在故事板中连接到unwindToRed展开segue和actionForUnwindButton按钮.它也会覆盖,prepareForSegue所以我们可以记录游戏的顺序.

输出:

actionForUnwindButton
prepareForSegue
unwindToRed
Run Code Online (Sandbox Code Playgroud)

故事板:

在此输入图像描述

编辑2

您的演示项目显示了这种工作.不同之处在于您使用barButtonItem来触发操作,而我使用的是常规按钮.barButtonItem失败,而常规按钮成功.我怀疑这是由于消息传递顺序的差异(接下来是猜想,但符合观察到的行为):

(A)View Controller中的UIButton

ViewController的按钮接收touchupInside
- (1)向其发送动作的方法
- (2)将segue展开动作发送到storyboard segue
收到的所有消息,以及按此顺序执行的方法:

actionForUnwindButton
prepareForSegue
unwindToRed
Run Code Online (Sandbox Code Playgroud)

(B)导航控制器工具栏中的UIBarButtonItem

工具栏buttonItem接收touchupInside
- (1)将segue展开动作发送到storyboard segue
- (2)(可能,然后)发送动作到viewController的方法

执行顺序是

prepareForSegue
unwindToRed
actionForUnwindButton
Run Code Online (Sandbox Code Playgroud)

prepareForSegueunwind收到的消息.但是actionForUnwindButton,在segue期间销毁viewController时,消息将发送到nil.因此它不会被执行,并且日志打印

prepareForSegue
unwindToRed
Run Code Online (Sandbox Code Playgroud)

在(B)的情况下,viewController在方法到达之前被销毁,因此不会被触发

所以看起来你的选择是...
(a)使用带动作的UIButton和展开segue
(b)触发你的动作使用prepareForSegue,这将在viewController仍然存在时触发,并在segue发生之前触发.
(c)不要使用展开segue,只需使用按钮动作即可.在操作方法中,您可以通过调用popToViewController导航控制器来"放松" .

顺便说一句,如果你在viewController上实现了一个toolBar(不使用导航控制器的工具栏),结果是相同的:首先触发segue,因此按钮操作失败.

在此输入图像描述