iOS 中碰到tableview组合下拉刷新崩溃

来源:互联网 发布:潜艇模型 淘宝 编辑:程序博客网 时间:2024/06/02 21:19

 在项目中碰到下拉刷新导致系统崩溃的情况。经过调试发现。代码并没有走过reloaddata时 但是形同崩溃了(tableview在初始化中并没有绑定数据 ,所以都是通过reloaddata方法去申请table中cell的重新绘制)因此可以说明系统在刷新数据的时候脱离了我们的管制,自己去刷新控件了,那么除了我们可以去手动刷新cell还有什么方法会导致cell重新绘制呢,猜测是代理方法。因为我发现。当屏幕不够展示说有cell的时候 系统并不会去绘制他,而是当他要显示出来的时候,系统回去绘制出来。

 首先贴上一个简单tableview的代码

////  ViewController.swift//  tableviewtest////  Created by 郑灵钟 on 16/8/22.//  Copyright © 2016年 郑灵钟. All rights reserved.//import UIKitclass ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {    let tabzlz = UITableView(frame: CGRect(x: 0, y: 0, width: 500, height: 600))     override func viewDidLoad() {        super.viewDidLoad()        self.tabzlz.delegate = self        tabzlz.dataSource = self                self.view.addSubview(tabzlz)    }        func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {        return CGFloat(200)    }      func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        return 5    }    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {              let zlzcell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "zlz")                print(indexPath.row)                return  zlzcell    }}

这是一个swft的代码。然后开始分析

     一当没有刷新控件并且tableview没有弹性设置的情况下: tableview 第一个cell在最顶端时 不可以继续往下拉

    二:当没有刷新控件时,tableview有弹性设置的情况下设置一个cell高度为200 用iphone测试,除了导航栏 下面可以显示2个多的cell,所以在开始进入页面时。打印出 0 1 2,

然后 然后往下拉tableview,分成两种情况: 一 轻松下拉:logcat并没有变化,二:用力下拉:logcat打印出2,。。。什么情况。。。说明用力下拉的时候,2cell 被回收了,让反弹回来的时候从新触发了tableview 的 代理 开始画view然而这时cell1 并没有被回收 所以,cell 1没有被重画,那么这个用力是个什么程度呢,目测也就 cell 1 的一半,说明,tableview在加载cell的时候会以cell的一半有没有被显示出来而去判断要不要去加载下一个cell

   三:当有刷新控件,没有弹性的情况下: 刷新控件没用。

  四:当有刷新控件,并且有弹性设置的情况下:

            逻辑1:进入页面:触发刷新,重置数据源,加载网络数据。调用reloaddata方法:

                               1:容易回收cell,然而不容易触发下拉:这是什么情况 其实就是cell高度很小,然而下拉触发刷新事件需要的距离很大 会发生一种什么样情况:向下拉反弹不报错。刷新控件也没有提醒数据刷新了,还是可以不断重新画view,但加大距离触发刷新,立马崩溃,因为,数据源被重置了,

                              2:cell的高度大于下拉触发的距离:但是,一个屏幕显示了1.5个多的cell


    算了 这么晚了 不瞎扯了 直接写上最终猜测吧:在触发tableview代理 重画cell的时候千万不要让数据源为空不然就会崩溃,显然重画的时候是我们放手的时候,下拉刷新也是我们放手的时候 所以 只要让我们放手的时候数据源不是空的程序变不会崩溃,然后 我们组装数据之前清空数据源,然后去reloaddata,,,其实还有一个办法就是别让cell重画,也就是让屏幕能显示的cell最多只有1.5个这样能保证cell不会重画。然后 程序也不会蹦了。


 











                  

0 0