iOS 5 не выполняет автоматическое представление при вызове loadView во второй раз - PullRequest
2 голосов
/ 20 декабря 2011

Когда я запускаю свое приложение в альбомном режиме, во второй раз, когда загружается представление моего контроллера представления и вызывается loadView, iOS 5 не поворачивает представление корневого контроллера представления от портрета и не вызывает willRotate контроллера представления Методы / willAnimateRotation / didRotate.

Как уже упоминалось, это происходит только после того, как представление выгружено и loadView вызывается во второй раз. В моем приложении я иногда выгружаю представление контроллера представления программно перед тем, как установить его в качестве корневого контроллера представления. Однако это также происходит, когда представление контроллера представления выгружается автоматически из-за предупреждения о нехватке памяти.

Это происходит только на iOS 5, а не на iOS 4.x. Воспроизвести в симуляторе iOS легко, и вот ссылка на автономное тестовое приложение, которое воспроизводит эту проблему:

http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip

Чтобы увидеть проблему, просто скомпилируйте приложение и запустите его в альбомном режиме с iOS 5.0 Simulator, затем нажмите «A», а затем «Назад», и вы увидите, как не происходит вращение.

Есть идеи? Это связано с тем, как я устанавливаю window.rootViewController?

1 Ответ

4 голосов
/ 20 декабря 2011

Я отлаживал через него, и, кажется, произошла смена между 4.3 и 5.0. В 4.3 UIKit вызывает [UIWindow addRootViewController:], в 5.0 - [UIWindow setRootViewController:]. Так что, может быть, что-то изменилось, что мы не можем видеть ...

Я бы предложил обойти это, , а не , используя [newController setupStuff] (таким образом, не , устанавливая представление в ноль), а вместо этого переопределяя

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // do setup stuff here, reset content etc etc.
}

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

Дополнительная информация:

а) вам не нужно устанавливать вид на ноль. Система сделает это за вас. При следующем обращении к свойству view этого контроллера представления система вызывает loadView, чтобы воссоздать представление:

Если вы обращаетесь к этому свойству и его значение в настоящее время равно нулю, представление контроллер автоматически вызывает метод loadView и возвращает результирующий вид. Метод loadView по умолчанию пытается загрузить представление из файла пера, связанного с контроллером представления (если есть).

b) Все сводится к поведению в iOS 5 относительно свойства rootViewController окна. В iOS 5 эти два не эквивалентны:

 self.window.rootViewController = newController;

против

 [self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
 [self.window addSubview:newController.view];

Первый полностью игнорирует ориентацию, второй нет.

Чтобы сделать вещи еще более сложными, если не переопределяет loadView, а вместо этого позволяет системе автоматически создавать пустой UIView и изменяет только это представление в viewDidLoad, предупреждение о памяти выиграло автоматически установить вид на ноль и освободить его - документы:

The default implementation releases the view only if it determines that it is safe to do so.

Магия. В зависимости от того, переопределяет метод или нет Я никак не могу это проверить.

Случай 1 - отменен loadView:
Вызов предупреждения памяти вызывает как didReceiveMemoryWarning и viewDidUnload

Дело 2 - нет loadView:
Вызов предупреждения памяти в симуляторе только вызовы didReceiveMemoryWarning, но не viewDidUnload

Я бы сказал, добавить представление вручную ...

веселит.

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