Я отлаживал через него, и, кажется, произошла смена между 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
Я бы сказал, добавить представление вручную ...
веселит.