Экран загрузки, пока UITableView выполняет «tableView: heightForRowAtIndexPath:» - PullRequest
1 голос
/ 06 сентября 2010

Я использую tableView:heightForRowAtIndexPath:, чтобы установить собственную высоту для каждой ячейки таблицы в UITableView. Это дорогостоящая операция, но я пока не нашел способа ускорить ее (в будущем я попробую некоторые из методов, упомянутых в taber ).

А сейчас я просто хотел бы показать какой-нибудь экран загрузки. его не нужно анимировать, если он виден во время загрузки табличного представления. Это возможно?

РЕДАКТИРОВАТЬ: я пробовал метод экрана загрузки, упомянутый в ответе Taber , но, поскольку он работает в том же потоке, что и UITableView, он не появляется, пока не закончится загрузка представления таблицы, и поэтому не очень полезен в этой ситуации:)

1 Ответ

1 голос
/ 06 сентября 2010

Попробуйте # 3:

Вы можете добавить индикатор активности в качестве нового представления поверх представления таблицы ... что-то вроде: http://tapadoo.com/2009/iphone-how-to-do-full-screen-activity-status - тогда хитрость будет выяснена, когда он фактически закончится. Я полагаю, что в вашем heightForRowAtIndexPath: методе вы можете сохранить какой-то счетчик строк и проверить, равен ли он> = счетчику строк модели данных. Это делает трюк?

Попробуйте №2:

Попробуйте закомментировать ваш переопределенный tableView: heightForRowAtIndexPath: метод полностью, и вместо того, чтобы создавать ячейки в cellForRowAtIndexPath: , попробуйте что-то вроде этого:



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  CGRect contentRectTall = CGRectMake(0.0, 0.0, 302.0, 140.0);
  CGRect contentRectMed = CGRectMake(0.0, 0.0, 302.0, 70.0);
  CGRect contentRectSmall = CGRectMake(0.0, 0.0, 302.0, 42.0);

  ... cell dequeue etc ...

  if ( ...the type of this cell is kRowTypeTall for example... ) {
    cell = [[[UITableViewCell alloc] initWithFrame:contentRectTall reuseIdentifier:CellIdentifier] autorelease];
    ...
  } else if ( ...the cell type is kRowTypeMed ) {
    ...
  } else if ( ...the cell type is kRowTypeSmall ) {
    ...
  }

  ... other cell customization ...

}

Кроме этого, вы можете захотеть взглянуть на «ленивую загрузку», где вы загрузите, скажем, первые 50 ячеек, а затем добавьте кнопку «загрузить еще 50» в конце.


Если вы уже знаете свой тип строки (который содержится в каком-либо источнике данных), его довольно быстро вытащить.

Что-то вроде ...


enum {
  kRowTypeHuge = 0,
  kRowTypeMed,
  kRowTypeSmall
};

-(id)init {
  ...
  NSArray *tableRows = [[NSArray alloc] initWithObjects:
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 1],
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 2],
    nil
  ];
  self.rows = tableRows;
  [tableRows release];
  ...
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSUInteger rowType = [[[self.rows] objectAtIndex: indexPath.row] unsignedIntValue];
  if(rowType == kRowTypeHuge) {
    return 105.0;
  } else if(rowType == kRowTypeMed) {
    return 44.0;
  }
  return 20.0;
}

Чтобы быть уверенным в том, что heightForRowAtIndexPath - это проблема ... что-то вроде этого отображается очень быстро?


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  return 52.0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...