码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-07 14:33:29      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:uitableview   uinavigationcontroller   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! DetailTrip
        detailTrip.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! String
        self.performSegueWithIdentifier("segueID", sender: self)
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var detailTrip: DetailTrip = segue.destinationViewController as! DetailTrip
        detailTrip.mainUrl = self.selectedTripUrl
    }

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

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

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

标签:uitableview   uinavigationcontroller   segue   

原文地址:http://blog.csdn.net/icetime17/article/details/45559963

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!