viewWillAppear не вызывается в UITableViewController? - PullRequest
4 голосов
/ 10 марта 2010

У меня есть пара классов UITableViewController, и я только что заметил, что эти методы не вызываются:

-(void)viewWillAppear:(BOOL)animated;
-(void)viewDidAppear:(BOOL)animated;

Я прочитал в http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0, что при вызове контроллеров представления мне придется самому вызывать эти методы, но это странно, поскольку он работает для всего, кроме UITableViewController.

Также создает проблему, когда мне нужно отменить выбор UITableViewCell в UIViewController, который выдвинул UITableViewController.

Ответы [ 7 ]

9 голосов
/ 05 мая 2010

Я не могу найти его в документации, но я думаю, что это может быть потому, что вы используете UINavigationController.

Как насчет установки свойства делегата UINavigationController и последующей реализации UINavigationControllerDelegate? Он предоставляет два дополнительных метода:

– navigationController:willShowViewController:animated: 
– navigationController:didShowViewController:animated: 

Например, navigationController: willShowViewController: animated: может выглядеть примерно так:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  if ([viewController isKindOfClass:[UITableViewController class]]) {
    [viewController viewWillAppear:animated];
  }
}

В любом случае, вы получите желаемое поведение без необходимости взламывать вызовы viewWillAppear: по всему вашему проекту.

5 голосов
/ 19 апреля 2010

Кто-нибудь решил эту проблему, потому что исходная запись верна - простое использование UITableViewController и помещение табличного представления этого контроллера в navController НЕ запускает эти методы, несмотря на тот факт, что это должно происходить. У меня есть серия UITableViewControllers и табличных представлений, которые выдвигаются и выталкиваются для отображения иерархических данных - ничего особенного, но методы "viewWill / Did / Appear / Disappear" никогда не вызываются. Вызываются только viewDidLoad и viewDidUnload.

Должна быть проблема с проводкой в ​​обеих наших установках, но все, что требуется, - это просто вставить представление в navigationController (?) - трудно поверить, что это могло остаться незамеченным в качестве фундаментальной ошибки так долго. *

0 голосов
/ 03 июля 2012

Это объяснение может помочь: http://www.mlsite.net/blog/?p=210

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

То же самое может произойти, если вы используете UITabViewController. Вы должны принудительно вызвать вызов viewWillAppear, реализовав обратные вызовы UITabViewControllerDelegate или UINavigationControllerDelegate

0 голосов
/ 26 января 2011

Ну, обсуждение, связанное с вопросом, имеет ответ прямо в нем. UINavigationController должен получить сообщение «viewWillAppear», чтобы он мог отправлять эти сообщения контроллерам представления, которые вы на него нажимаете.

По иронии судьбы, если вы не делаете то, что рекомендует Apple, и вы подкласс UINavController для вашего контроллера представления, то все работает отлично.

Однако, если вы просто создаете UINavController внутри вашего контроллера представления, то вам нужно реализовать "viewWillAppear", "viewDidAppear" и так далее и перенаправить их на ваш контроллер nav.

Обратите внимание, что это особенно важно, если вы используете Three20, потому что его иерархия контроллера представления ожидает получения сообщения "viewWillAppear". Если это не так, вы можете получить TTTableViews, которые не рисуют.

0 голосов
/ 29 октября 2010

Я вижу ту же проблему. У меня есть простой UIView из IB, и я делаю addSubview с классом, который расширяет UITableViewController.

Я могу видеть представление TableViewController без проблем в моем приложении, но функция viewWillAppear никогда не вызывается в этой ситуации.

0 голосов
/ 10 марта 2010

Эти два метода вызываются по умолчанию для уведомления об изменениях. UITableViewController является подклассом UIViewController, поэтому поведение будет таким же. Вы можете увидеть больше в Руководство по программированию контроллера View

Методы viewWillAppear: и viewDidAppear: дают подклассам возможность выполнять любые дополнительные действия, связанные с внешним видом представления.

Откуда вы знаете, что эти методы не вызываются? Можете ли вы предоставить еще несколько кодов или, по крайней мере, протестировать их с помощью NSLog (), чтобы посмотреть, есть ли напечатанные сообщения.

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