iPhone - обновить текущее представление, прежде чем нажать новый ViewController на выбранном UITableViewCell - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть UITableView со списком предметов. При выборе элемента я перехожу к новому представлению, которое отображает детали выбранного элемента, используя:

DetailsVC *detailsView = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil];
[self.navigationController pushViewController:detailsView animated:YES];

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

Проблема в том, что отображение добавленного индикатора задерживается до тех пор, пока следующий вид не будет готов к навигации, что делает индикатор бесполезным.

Я пытался добавить этот индикатор в эти 2 события с одинаковым эффектом:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

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

В качестве эксперимента я также попытался открыть представление оповещения в тех же двух событиях, что привело к всплывающему оповещению после перехода к представлению сведений.

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Вы можете либо

  1. добавить индикатор, когда вы выбираете строку, и выдвигать новый вид, когда пришли данные (одновременно удалить индикатор) или
  2. Нажмите новый вид, позвоните в веб-службу, чтобы получить соответствующие данные ячейки (в viewDidLoad или viewWillAppear) и индикатор отображения одновременно и когда приходят новые данные, уберите индикатор
0 голосов
/ 01 апреля 2011

Так что [[DetailsVC alloc] init...] это занимает несколько секунд, верно?Эта проблема заключается в том, что любые внесенные вами изменения не вступают в силу полностью до тех пор, пока не вернутся обратно к циклу выполнения, поэтому даже если вы настроили индикатор перед созданием объекта, он также ожидает завершения инициализации, чтобы сделать себя видимым,Что вам нужно сделать, так это отложить создание вашего DetailsVC до тех пор, пока индикатор не будет настроен.

Возможно, мне проще использовать блоки, но я не могу вспомнить подробности этого из верхней частимоя голова (мало использовал блоки, так как код, который я писал в последнее время, должен был оставаться совместимым с 3.x).Но использовать performSelector тоже легко, возьмите те две строки, которые вы впервые процитировали в своем вопросе, и поместите их в свой собственный метод, такой как:

- (void)pushDetailsView {
  DetailsVC *detailsView = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil];
  [self.navigationController pushViewController:detailsView animated:YES];
}

И там, где у вас были эти строки ранее, настройтеиндикатор и затем сделайте это (задержка 0 не означает, что он вызван сразу, а скорее как можно скорее после полного возврата из текущего стека вызовов):

[self performSelector:@selector(pushDetailsView) withObject:nil withDelay:0]
0 голосов
/ 01 апреля 2011

вы можете вызвать cell = [self rowForIndexPath:indexPath] в одной из ваших функций. а затем добавить индикатор в ячейки subview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...