在UITableView中使用segue进行页面跳转的注意事项

在之前的一篇学习记录UINavigationController的简单总结中, 介绍了使用UINavigationController及segue实现View之间的跳转, 并在两个View之间进行数据的传递. 如果该segue是连接UITableViewCell与WebViewController, 点击单个cell的时候, 发现页面会跳转至WebViewController, 但想要的数据却并未成功地通过segue进行传递. 通过调试, 发现prepareForSegue会比didSelectRowAtIndexPath提前调用. 而准备数据的代码是在prepareForSegue执行的, 所以页面跳转但是数据未成功传递. 这是什么原因呢?

UITableViewCell与WebViewController之间的segue

原来, 之前的代码中, 该segue是直接连接UITableViewCell与WebViewController的, 所以点击cell直接调用prepareForSegue, 然后调用默认的performSegue跳转View.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {var detailTrip: DetailTrip = segue.destinationViewController as! DetailTripdetailTrip.mainUrl = self.selectedTripUrl}

在prepareForSegue, 我们会将预期传递给WebViewController的数据准备好(即self.selectedTripUrl). 其中, self.selectedTripUrl是通过didSelectRowAtIndexPath来获取的. 但是, TableView的didSelectRowAtIndexPath却是稍后调用的. 即我们预期的是通过didSelectRowAtIndexPath来获取传递给WebViewController的对应数据(存于每个UITableViewCell中), 而该数据是在页面跳转之后才准备好的. 所以, 结果就是 页面先跳转成功了, 但是数据没有传递过来, WebViewController会显示空白. 我个人觉得这个问题的本质是: 点击cell就能立即实现WebView跳转(因segue直接连接cell与WebViewController), 然后该点击事件会向上传递给UITableView, 接下来在UITableView这一层进行事件响应(点击这个cell的处理方法didSelectRowAtIndexPath). 这其实有点类似JS中的冒泡事件. 个人看法, 如有错误, 请各位大神指正.

UITableViewController与WebViewController之间的segue

解决这个问题的方法之一: 将segue更改为连接UITableViewController与WebViewController. 则, 点击该cell, 立即表现为UITableView的一个cell被选中, 调用didSelectRowAtIndexPath, 然后再手动调用performSegueWithIdentifier来实现View跳转. 而准备数据的代码就可以顺利通过segue传递了.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {self.selectedTripUrl = self.products[indexPath.row][“mainUrl”] as! Stringself.performSegueWithIdentifier(“segueID”, sender: self)}override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {var detailTrip: DetailTrip = segue.destinationViewController as! DetailTripdetailTrip.mainUrl = self.selectedTripUrl}

整个点击cell事件的执行逻辑为: 点击cell -> UITableView的didSelectRowAtIndexPath -> 获取选中cell的内容 -> 调用performSegueWithIdentifier跳转View. 而performSegueWithIdentifier的执行中, 会自动先去调用prepareForSegue以准备传递数据.

以上内容, 不清楚是不是完全合理, 如有错误, 欢迎指正.

,分明是比谁记的都清楚,比谁都更加在意,

在UITableView中使用segue进行页面跳转的注意事项

相关文章:

你感兴趣的文章:

标签云: