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)
prepareForSegue和unwind收到的消息.但是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,因此按钮操作失败.

| 归档时间: |
|
| 查看次数: |
14226 次 |
| 最近记录: |