活动指示器未显示在iPhone上

时间:2010-08-27 02:30:37

标签: iphone objective-c uiactivityindicatorview

我在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之前显示?

1 个答案:

答案 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;
}

干杯