从打造新闻app学到的(5):解决TableCell调用segue的时序问题

在从TableCell跳转到具体新闻页面的时候,我遇到了一个问题:整个流程的时序跟我想的不太一样。因为我需要在点击Cell的时候知道这是哪个Cell,再将它作为参数传递给下一个View,所以我实现了函数 didSelectRowAtIndexPath,然后设好一个private的变量,供prepareForSegue调用。可是事实上的流程却变成了:

prepareForSegue() -> next.viewDidLoad() -> didSelectRowAtIndexPath()

也就是说当Cell的点击发生,会先调用StroyBaord中设置的Segue,新的View初始化完成后再回调didSelectRowAtIndexPath,导致我在viewDidLoad()中拿不到想要的数据。
在网上搜了一下,有人也遇到了同样的问题,他的解决方法是:
1) 将 ->NextView的Segue改为 ->NextViewController(NextView的代理)
2) 在StoryBoard中配置此Segue的ID为“ABC”
3) 在didSelectRowAtIndexPath()准备好数据之后手动调用转场:

//跳转到下一个页面,识别“ABC”
self.performSegueWithIdentifier(“ABC”, sender: self)

实测这个方法是有效的,不过我总感觉不够漂亮……于是打开Dash把所有tableView()的相关Callback都过了一遍,挑出几个加打印实测,

你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

转载请注明出处:http://conanwhf.github.io/2015/12/23/newsreader-5/

访问原文「从打造新闻app学到的(5):解决TableCell调用segue的时序问题」获取最佳阅读体验并参与讨论

找到了这个:willSelectRowAtIndexPath
看起来这是一个专门给人做点特殊需求的API,如果我们将其返回nil而不是当前的Index:

func tableView(tableView: UITableView,  willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath?    {
//TODO anything you want
return nil
//return indexPath
}

那么无论你怎么点击,Cell都不会再响应任何selected事件了……😈虽然没有做更多的尝试,但我猜如果这时候返回一个修改过的indexPath也是可以做到的,比如怎么点都是同一个结果之类……😏
说回正事。现在我们可以把数据的获得放到willSelectRowAtIndexPath()中了,流程变成了:

willSelectRowAtIndexPath() ,_获得要传递的数据_

-> prepareForSegue() ,_传递数据的准备_

-> next.viewDidLoad(),_通过Segue调用新的View_

-> [如果你依然需要] didSelectRowAtIndexPath()

问题解决!😄