2013-11-13 3 views
0

Есть ли более короткий способ написать его? кажется, длинный путь, чтобы получить экземпляр playersViewController ...iOS: обновление уже загружено tableView

UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    UITabBarController *tabBarController = (UITabBarController *)window.rootViewController; 
    UINavigationController *navigationController = [[tabBarController viewControllers] objectAtIndex:0]; 
    PlayersViewController *playersViewController = [[navigationController viewControllers] objectAtIndex:0]; 
    [playersViewController.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

Я обновив уже загруженную Tableview

#pragma mark - RatePlayerViewControllerDelegate 
- (void)ratePlayerViewController: (RatePlayerViewController *)controller didPickRatingForPlayer:(Player *)player 
{ 
    if (player.rating != self.requiredRating) 
    { 
    // do stuff.. in self.tableView 
    // refresh players tableView 
+0

В каком-то контексте было бы неплохо. – Holly

+0

MVC: сначала вы должны изменить модель (данные), а затем обновить UI (view) соответственно –

+0

, это выполняется в другом классе, rankviewcontroller, в котором пользователь оценивает игрока ... после этого просмотр игроков должен быть обновлен с новым рейтингом , так что есть 4 линии, чтобы получить playviewcontroller tableview, а затем последняя строка перезагружает данные игроков (с новым рейтингом). моей озабоченностью является то, как сократить (если возможно) эти 4 строки ... но это может Невозможно .... – erwin

ответ

1

Вы можете использовать уведомление

PlayersViewController.m

добавить эту строку в метод инициализации:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadPlayers:) name:@"reloadPlayersNotification" object:nil]; 

и реализовать метод

- (void)reloadPlayers:(NSNotification *)notification { 
    [self.tableView reloadData]; 
} 

Не забудьте удалить наблюдателя, когда ваш Tableview не должен получить reloadData вызова (например, если Tableview не видно)

[[NSNotificationCenter defaultCenter] removeObserver:self [email protected]"reloadPlayersNotification" object:nil] 

и теперь, если вы хотите, чтобы перезагрузить эту Tableview из другого класса:

[[NSNotificationCenter defaultCenter] postNotification:@"reloadPlayersNotification"]; 
0

Если вы хотите, чтобы перезагрузить ваш UITableView просто использовать [self.tableView reloadData]

EDIT: Следует помнить, что вы всегда должны обновлять представления в основном потоке. Я не уверен, что вы делаете в точности, но никогда не больно быть в безопасности, а не извиняться. Следующее будет перезагружать ваш tableView в основном потоке.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 
+0

Он хочет перезагрузить tableview из другого класса, поэтому 'self.tableview' не будет работать. Кроме того, нет никаких указаний на то, что многопоточность вступает в игру для вопроса OP. –

+0

@AaronBrager self.tableView не должен был быть буквальным Я предположил, что он может экстраполировать смысл и предоставить свой собственный tableView. Он просто изменил бы его на 'playersViewController.tableView'. Более того, ни я, ни вы не знаете, что происходит в остальной части его приложения или почему он перезагружает стол. Лучше быть в безопасности, а не извиняться и всегда обновлять основной поток. –

+0

вы правы Aaaron, я делаю это из другого класса, и нет многопоточности ... Я обновляю основной поток ... 5-я строка: [playersViewController.tableView выполняетSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: NO]; это прекрасно работает ... Меня беспокоят только все предыдущие строки, необходимые для получения игроковViewController ... из другого класса ... – erwin

Смежные вопросы