在项目中碰到下拉刷新导致系统崩溃的情况。经过调试发现。代码并没有走过reloaddata时 但是形同崩溃了(tableview在初始化中并没有绑定数据 ,所以都是通过reloaddata方法去申请table中cell的重新绘制)因此可以说明系统在刷新数据的时候脱离了我们的管制,自己去刷新控件了,那么除了我们可以去手动刷新cell还有什么方法会导致cell重新绘制呢,猜测是代理方法。因为我发现。当屏幕不够展示说有cell的时候 系统并不会去绘制他,而是当他要显示出来的时候,系统回去绘制出来。
首先贴上一个简单tableview的代码
//
// ViewController.swift
// tableviewtest
//
// Created by 郑灵钟 on 16/8/22.
// Copyright © 2016年 郑灵钟. All rights reserved.
//
import UIKit
class 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不会重画。然后 程序也不会蹦了。