iOS编程之UnwindSegue的使用(Xcode6.3 iOS8.x Swift Storyboard)

1. 什么是UnwindSegue以及UnwindSegue的基本用法

1.1 UnwindSegue 的基本概念

关于UnwindSegue的基本概念可以在Apple的document中查看,同时,在stack overflow上也有关于它的详细例子。
以下是apple的ios开发文档中对UnwindSegue的说明。

Unwind segues give you a way to “unwind” the navigation stack back through push, modal, popover, and other types of segues. You use unwind segues to “go back” one or more steps in your navigation hierarchy. Unlike a normal segue, which create a new instance of their destination view controller and transitions to it, an unwind segue transitions to an existing view controller in your navigation hierarchy. Callbacks are provided to both the source and destination view controller before the transition begins. You can use these callbacks to pass data between the view controllers.

大意是:UnwindSegue可以让我们以push, modal, popover等其他segue的形式“放松地(自由地)”在导航堆列中跳转。我们用UnwindSegue“回跳”至navigation层级中得一个或多个界面前的一个界面。与一般的segue不同的是,UnwindSegue开创了一种新的(定义)目的视图控制器的方法并跳转到那个视图,当然,这个视图必须存在于navigation层级中。在跳转开始前,为源视图和目的视图均提供了Callback函数,我们可以通过这些Callback函数来传递数据。

从以上信息中我们可以看出,UnwindSegue和一般的Segue的最大区别是:

  1. UnwindSegue可以跳转到之前的一个或多个视图,其实也就是之前的任意一个视图,当然,这个视图必须在navigation堆列(stack)之中;而一般的Segue只能跳转到相邻的一个视图。
  2. UnwindSegue只能跳转到已经在navigation stack中存在的视图,还未创建的视图无法跳转;而一般的Segue则无此限制。

所以,一般的,在需要跳转到前两个或三个以上的视图时才需要用到UnwindSegue。

1.2 UnwindSegue的用法

如前文中提及的Apple的documentstack overflow中的例子,均有对UnwindSegue用法的详细解说,这里稍作总结。

使用UnwindSegue大概可分为以下几步:

    1. 在目标视图中创建一个action,以提供给源视图作为识别和接口。代码形如
      @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
      }
      
    2. 在源视图中定义exit的关联项目,这个项目一般是一个按钮,方法是在exit图标上按右键,这时会弹出一个选择目标视图action的列表,这个action即是1中定义的action,点击对应的action后面的空心小圆圈,按住左键拖拽到按钮上释放,源视图中这个按钮到目标视图的UnwindSegue就建立起来了非常方便,如下图UnwindSegue-exit-button
    3. 当然,2中的那个项目不一定是个按钮,也可以是其它东西,也可以没有这个项目,比如,我们想在源视图控制器中做个判断,当满足一定条件时就进行UnwindSegue,那么这个时候的操作是,在exit上按住右键拖拽到视图控制器图标上释放,如下图UnwindSegue-exit-vc这时,这个UnwindSegue就创造出来了,但是,我们还需要指定这个UnwindSegue的id,然后我们在源视图控制器中就可以通过这个id来执行这个UnwindSegue,语法是:
      self.performSegueWithIdentifier("unwindtoDestinationVC", sender: self)

      其中unwindtoDestinationVC即是UnwindSegue的id。

2. 在UnwindSegue前执行一些任务的方法

有时候我们需要在UnwindSegue前进行一些操作,比如,从当前视图转出时,需要先将当前视图中的某些输入的内容存入数据库,然后再执行跳转。此时,就需要注意各种操作和语句执行的时序。

2.1 UnwindSegue与普通按钮关联

当exit与一个UnwindSegue和一个按钮绑定起来的时候,如1.2中2所表示的那样,这时候的执行顺序是这样的:

  1. 按钮被按下,向系统发送这一事件消息;
  2. 执行按钮的action;
  3. 执行prepareForSegue;
  4. 执行UnwindSegue。

2.2 UnwindSegue与toolbar上的item关联

在实践中发现,当exit与一个UnwindSegue和一个toolbar(底部toolbar/顶部navigation bar)按钮绑定起来的时候,执行的顺序和视图中的普通按钮有所不同,具体是这样的:

  1. 按钮被按下,向系统发送这一事件消息;
  2. 执行prepareForSegue;
  3. 执行UnwindSegue。

也即是说,该bar上的按钮所绑定的action并不会被执行,也就是说他们是segue优先的。那么如果非得在此之前执行一点儿任务怎么办呢?

可以这么做:

  1. 在目标视图控制器中创建一个unwindsegue;
  2. 将源视图的exit绑定到view上,而非一个具体的按钮;
  3. 定义bar按钮的action;
  4. 在bar按钮的action中先执行一定的任务,然后在合适的位置执行
    self.performSegueWithIdentifier("unwindtoDestinationVC", sender: self)

这样,即能实现在unwindsegue前完成一定的任务。


相关代码

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据