iOS UITableView reloadData 方法 无效,或者不执行,导致 TableView 不刷新 原因。
转载 http://www.cnblogs.com/zxykit/p/5664192.html 人家总结的很到位
reloadData不执行有好多总情况
1.没有实现代理,这是最最基本的
_tableView.dataSource=self;
_tableView.delegate=self;
2.reloadData 方法要在主线程执行。好多情况请求远程数据,是在其他线程请求的,所以直接在数据回调处 执行reloadData方法,导致 reloadData无效
3.change the dataSource in the mainThread(改变数据源,也在主线程执行),不然reloadData也会无效,所以,远程得到数据后可以这样,在主线程改变数据,数组的修改也可以放到 setList 方法里:
dispatch_async(dispatch_get_main_queue(), ^{
//resultString 是返回的数据
dict = [NSJSONSerialization JSONObjectWithData:[resultString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
BOOL resultFlag=[[dict objectForKey:@"flag"] boolValue];
if(resultFlag){
[self setList];
}else{ //失败 提示原因
[SVProgressHUD dismiss];
[GlobalTool showToast:server_error];
}
});
4.reloadData方法要在包含tabview的 当前对象调用。什么意思呢,举个例子(我犯的错误),在MyViewController 中放置了 TabView 同时引用了 自定义的View myView;myView中调用 [MyViewController setList]:
MyViewController myViewController=[[MyViewController
alloc] init];
[myViewController setList];
//setList 方法中调用的reloadData
reloadData 气人的没有执行。
冷静分析了一下 我调用方式有问题,[myViewController setList],myViewController已经是new 的一个新对象 和已经展示的MyViewController没半毛钱关系,所以我需要在 自定义的myView中拿到当前的MyViewController 然后执行[myViewController setList],就可以了;
总结:还是自己基础没有打好,对于指针的引用会犯低级错误,明明是A ViewController中的TabView 我偏偏new了一个B ViewController 执行reloadData,所以没有效果;还有为什么,建议数据源的改变也放到主线程,也是处于数据安全的考虑,子线程 不知道什么时候把数据更换了,UI线程都不知道,有时间多看看基础的知识,会有意外收货