但是,这里有一个这样的问题:
我们假设现场B中有一个按钮可以将场景A解开,并且在它之前我想要完成某些操作,例如将数据保存到数据库.我在B.swift中为这个按钮创建了一个动作,但是它似乎直接进入场景A,而不需要指定动作.
任何人都知道为什么或如何做到这一点?
谢谢.
解决方法
@IBAction func actionForUnwindButton(sender: AnyObject) { println("actionForUnwindButton"); }
要么…
override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) { println("prepareForSegue"); }
第一个例子是你所描述的.该按钮连接到展开区域,并在Interface Builder中连接到按钮操作.按钮操作将在segue操作之前触发.也许您没有将操作连接到界面构建器中的按钮?
第二个例子使您可以访问segue的sourceViewController和destinationViewController,以防万一也很有用(您也可以在目的地视图控制器中的unwind 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"); } }
BlueViewController有一个按钮,在故事板中连接到BindH的展开卷展开和动作ForUnwindButton按钮.它也覆盖了prepareForSegue,所以我们可以记录播放顺序.
输出:
actionForUnwindButton prepareForSegue unwindToRed
故事板:
编辑2
您的演示项目显示这不工作.不同之处在于您正在使用barButtonItem触发操作,而我正在使用常规按钮. barButtonItem失败,而常规按钮成功.我怀疑这是由于消息传递顺序的差异(以下是推测,但符合观察到的行为):
(A)视图控制器中的UIButton
ViewController的按钮接收到touchupInside
– (1)向该方法发送动作
– (2)向故事板发送segue展开动作
收到的所有消息和按此顺序执行的方法:
actionForUnwindButton prepareForSegue unwindToRed
(B)导航控制器工具栏中的UIBarButtonItem
工具栏buttonItem接收touchupInside
– (1)向故事板段发送segue展开动作
– (2)(可能的话)将action发送给viewController的方法
执行顺序是
prepareForSegue unwindToRed actionForUnwindButton
prepareForSegue和展开收到的消息.然而actionForUnwindButton消息被发送到nil,因为viewController在segue期间被销毁.所以它不会执行,日志打印
prepareForSegue unwindToRed
在(B)的情况下,viewController在方法到达之前被销毁,所以不会被触发
所以看来你的选择是…
(a)使用UIButton与动作和放松segue
(b)使用prepareForSegue触发您的操作,这将在viewController仍然存在时触发,并在segue发生之前触发.
(c)不要使用放卷,只需使用按钮操作.在动作方法中,您可以通过在导航控制器上调用popToViewController来“展开”.
顺便说一下,如果在viewController上实现了一个工具栏(不使用导航控制器的工具栏),结果是一样的:首先触发segue,因此按钮操作失败.