iOS UITableView reloadData问题总结

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线程都不知道,有时间多看看基础的知识,会有意外收货

你可能感兴趣的:(ios开发)