稍微知道了一点点prepareForSegue的应用。先记一下。
首先贴上Checklists应用中ChecklistViewController中prepareForSegue方法的使用。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if segue.identifier == "AddItem"{
// segue's identifier
//2
// the segue does not go directly to AddItemViewController but to the navigation controller that embeds it.
let navigationController = segue.destinationViewController as! UINavigationController
//3
let controller = navigationController.topViewController as! AddItemViewController
//4
controller.delegate = self
}
else if segue.identifier == "EditItem"
{
let navigationController = segue.destinationViewController as! UINavigationController
let controller = navigationController.topViewController as! AddItemViewController
// The view controller at the top of the navigation stack. 获取需要的ViewController
controller.delegate = self
if let indexPath = tableView.indexPathForCell(sender as! UITableViewCell)
{
controller.itemToEdit = items[indexPath.row]
}
}
}
// 这个method 主要解决2个问题:
// (1) 获取所要跳转到的视图控制器(ViewController);这里是AddItemViewController
// (2) 同时,将上一个视图的数据(A),传递给下一个视图(B)。 (比如: 上一个视图是TableView, 那么,就可能要将点击cell的行号传递到下一个视图)。
// 获取到下一个视图控制器后, 可以跳转过去了。但仅仅跳转还不够,总得将数据传递过去吧。 比如上一个视图是TableView,当用户点击某个Cell进入下个页面时,就得将所点击的cell的内容传递给下个页面。
// 该方法的触发条件是:当前的视图控制器即将被另一个视图控制器所替代时,segue将处于激活状态,从而调用prepareForSegue方法.
// segue:用以描述一个跳转的相关信息,比如是A controller,跳转至B controller页面,则我们可以通过它获取到A controller的一个实例对象,和B controller的一个实例对象。注意调用这个函数的时候,跳转行为还没有发生,所以我们可以在这个方法内部,获取到B controller的实例,然后传递一些参数过去。
// sender:表示是谁触发了这次跳转。因为是从A--->B,所以这个sender可能是A controller里面的任何一个对象。我们可以用它来区分同一个页面上触发的不同的跳转行为。这里的segue.identifier对应了在主界面即ChecklistViewController中点击的按钮对应的方法。比如点击了AddItem按钮,segue.identifier就是AddItem。
// 比如:A页面上有2个按钮x,y,当点击x按钮时,就跳B页面;当点击y按钮时,就跳C页面。所以当点击x按钮时,触发了一个跳转,UIStoryboard的运行时就会去调用A controller里面的这个函数,其中sender就是x按钮。点击y按钮类似。这时候我们就可以判断如果sender是x按钮,则给B页面传递数据;如果按钮时y,则给C页面传递数据。或者是其他业务逻辑。
这里,由于ChecklistViewController直接指向的是UINavigationController,所以segue的segue.destinationViewController是UINavigationController。内嵌于UINavigationController的AddItemViewController才是我们想要指向的ViewController。所以使用navigationController.topViewControllerA获取AddItemViewController这个界面。
如果是AddItem唤醒的segue,则不用将数据从A传递给B。如果是EditItem唤醒的segue,则需要将数据从A中的item传递给B:controller.itemToEdit = items[indexPath.row]
同时在B中,我们需要定义optional的变量:var itemToEdit: ChecklistItem?