индикатор активности не отображается на iPhone - PullRequest
1 голос
/ 27 августа 2010

Я использую стандартный интерфейс навигатора на iPhone. Когда я перехожу из таблицы верхнего уровня на следующий уровень, мне нужно загрузить около 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 Ответ

3 голосов
/ 27 августа 2010

Прежде всего, зачем вам нужно загружать 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;
}

Приветствия

...