TableView reloadData 没有重新加载?
Posted
技术标签:
【中文标题】TableView reloadData 没有重新加载?【英文标题】:TableView reloadData not reloading? 【发布时间】:2014-10-03 10:30:38 【问题描述】:首先我使用 initWithCoder 初始化表格,然后将数据加载到单元格中。当数据源更改(这是 Web 服务)时,我希望重新加载表。只是为了测试我连接了按钮操作并添加了[self.tableView reloadData]
但是表没有重新加载,但数据源已更改。如果我转到不同的视图并返回表视图,则会显示新数据。有什么建议吗?
- (id)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
self.titleList = [[SearchModel alloc] init];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self.titleList load: ^(id json)
[self.tableView reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
];
return self;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
self.tableView.delegate = self;
self.tableView.dataSource = self;
static NSString *CellIdentifier = @"title";
TitleDetailCell *cell = nil;
Model *title = nil;
title = [self.titleList get:indexPath.row];
if (cell == NULL)
cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
[cell movieTitleLabel].text = [title get:@"title"];
[[cell movieImageView] setImageWithURL: thumbnail];
return cell;
【问题讨论】:
为什么要在 cellForRowAtIndexPath 方法中设置表委托和数据源?如果一开始就没有设置数据源,它将永远不会被调用 我应该在哪里设置?我试着把它放在 viewDidApper 重新加载数据之前的任何位置。 viewDidLoad: 是通常的地方。或者如果您使用 IB - 最好在那里设置委托和数据源 【参考方案1】:两件事:
-
您不对到达回调 (
json
) 的数据做任何事情。您是否需要将其存储在任何地方以便在表格视图中显示?
回调发生在主线程还是后台线程?如果你在做 UI 的东西,你需要确保它在主线程上
【讨论】:
数据存储在@property (nonatomic, strong) SearchModel *titleList;回调是什么意思。数据源在模型类上更改的主线程上没有更改,我从 initWithCoder 调用的那个。我知道数据何时更改,所以我正在调用重新加载表。 您的意思是模型将数据加载到自身中?回调是指您传递给load:
的块。您似乎将该评论中的类和线程混为一谈?
没有。那是模型类的实例。模型类从 Web 服务获取数据并返回数据。在 initWithCoder 中调用模型类。我是初学者,请澄清主线程是什么意思,我应该如何知道数据是否加载到主线程上。谢谢【参考方案2】:
当时initWithCoder:
被称为tableView
尚未创建。
将代码从initWithCoder:
移动到viewDidAppeare:
,在主线程上重新加载数据,应该会有所帮助:
self.titleList = [[SearchModel alloc] init];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self.titleList load: ^(id json)
// Log data to see is data is ready
NSLog(@"%@",[title get:@"title"]);
// Reload table on the main thread
dispatch_async(dispatch_get_main_queue(), ^
[self.tableView reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
);
];
【讨论】:
在这种情况下不会加载任何内容。我想表格的数据需要在视图出现之前准备好。所以我将代码放置到 viewWillApper 但没有重新加载。 是的,在调用 reloadData 之前需要准备好数据。在 viewDidAppeare 中加载数据,记录它以确保数据准备就绪并重新加载表视图。如果日志显示您缺少数据,则您的问题出在 SearchModel 类中。 我将代码放在 viewDidApper 中,数据加载正常。但是重新加载仍然不起作用。 @JamesDouglas 在主线程上重新加载表,请参阅更新的答案。以上是关于TableView reloadData 没有重新加载?的主要内容,如果未能解决你的问题,请参考以下文章
使用 tableView.reloadData() 重新加载 TableView 的问题
tableView.reloadData() 如何正确重新加载数据?
tableView.reloadData() 不起作用,可能没有在主线程上调用
tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview