我表格中的单元格有一个字幕集,可以显示从Web服务器加载的一些额外信息。当应用加载字幕时,只需说“#34;正在加载..."然后当收到响应并解析时,单元格会更新。
问题是,除非我点击单元格,否则字幕将保留在"正在加载..."。一旦我点击它就会更新到正确的字幕。
这里我初始化单元格,并在执行http请求时设置临时字幕</ p>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// Setting the tableviewcell titles
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.detailTextLabel.text = @"Loading...";
cell.detailTextLabel.enabled = NO;
return cell;
}
我尝试过在不同的地方调用请求方法:
willDisplayCell
和cellForRowAtIndexPath
。
从Web服务器获取数据的方法使用异步NSURLConnection
,当收到成功的响应时,我使用以下命令更新单元格字幕文本:
// Map Reduce the array used by the TableView
for (int i = 0; i < [self.routes count]; i++) {
if(cellMatches){
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
cell.detailTextLabel.text = @"Data received!";
cell.userInteractionEnabled = YES;
cell.textLabel.enabled = YES;
cell.detailTextLabel.enabled = YES;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
我知道您可以使用tableView reloadRowsAtIndexPaths
重新加载特定的单元格,但在实现此代码时似乎无法正常工作:
[self.tableView beginUpdates];
// Change cell subtitle
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
我有一个定时器设置为每隔30秒调用一次请求方法,当调用它时它没有问题,并且立即更新字幕而不必点击它。所以我认为问题是该单元格没有初始化,或者可能是在发出Web请求后重新初始化。但在此方法中我不会致电reloadAllData
。
答案 0 :(得分:0)
试试这个:
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
而不是:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
答案 1 :(得分:0)
您需要做的是更新cellForRowAtIndexPath
,以便检查数据。如果数据可用,请将字幕设置为数据,否则显示&#34;正在加载&#34;。这要求您拥有某种数据模型,以便在收到数据时存储数据。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
BOOL enabled = YES;
NSString *subtitle = ... // get the value from the data model
if (subtitle) {
cell.textLabel.text = ... // whatever value goes here
cell.detailTextLabel.text = subtitle;
cell.detailTextLabel.enabled = YES;
} else {
// There's no value for this row yet - show "Loading"
cell.textLabel.text = ... // whatever value goes here when loading
cell.detailTextLabel.text = @"Loading";
cell.detailTextLabel.enabled = NO;
}
return cell;
}
请确保根据需要在if/else
语句的两半中设置相同的单元格属性集。
获取新数据并更新数据模型后,只需调用reloadRowsAtIndexPaths:
以获取正确的单元格路径即可。然后,上面的代码将正确更新单元格。
现在应该删除您更新单元格的代码,因为它不是正确的方法。
答案 2 :(得分:0)
除了rmaddy的解决方案,我还需要添加一个重要的事情found in a similar question:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
完全解决了这个问题。