我在iPhone上使用标准的导航界面。当我从最高级别的tableview移动到下一级别时,我必须从核心数据加载大约2000条记录,这可能需要5-10秒,所以我想使用活动指示器。
我已经完成了以下代码,如果我删除了DidSelect方法中的代码,但是否则指示符永远不会出现,即使视图在另一个视图加载时仍然等待。以下是方法:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//-- start activity indicator (will be stopped when view disappears)
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
[cell.contentView addSubview:m_activityIndicator];
[m_activityIndicator startAnimating];
return indexPath;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//--show the listViewController
CardListViewController *listViewController = [[CardListViewController alloc] initWithNibName:@"CardListViewController" bundle:nil];
NSString* selectedCardTypeName = [rootSelectionList objectAtIndex:indexPath.row];
enum CardTypes selectedCardType = cardTypeIDFromCardTypeName(selectedCardTypeName);
listViewController.selectedCardType =selectedCardType;
[self.navigationController pushViewController:listViewController animated:YES];
[listViewController release];
}
如何强制活动指示器在开始处理下一个listviewcontroller之前显示?
答案 0 :(得分:3)
首先,为什么需要同时加载2k行?你懒惰为什么不这样做?
首先,在加载表视图时,您将使用数据源仅计算要显示的行数,查询核心数据以仅获取数字,因此您的表视图将准备好显示所有必要的细胞。
其次,仅从核心数据加载您需要的内容,这意味着只有屏幕上的内容。想象一下,如果用户非常快速地拖动和滚动表视图,则可以加载许多单元而不需要它。正确的做法是只加载可见单元格,这意味着滚动过程停止时可见的单元格。
看一下Apple的这个例子,讨论如何懒惰地为表视图加载资源:http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Listings/Classes_RootViewController_m.html#//apple_ref/doc/uid/DTS40009394-Classes_RootViewController_m-DontLinkElementID_12
它适用于图像,但您可以对获取对象采取相同的想法。
懒洋洋地这样做你不需要活动指示器。
顺便说一下,回到活动指标的问题,您可能需要让您更新单元格:- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//-- start activity indicator (will be stopped when view disappears)
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
[cell.contentView addSubview:m_activityIndicator];
[m_activityIndicator startAnimating];
[cell setNeedsDisplay];
return indexPath;
}
干杯