Ответы выше слегка неполные.Предположим, у вас есть 2 контроллера представления, ControllerA и ControllerB.
ControllerA.view уже добавлен в окно (это родитель), и вы хотите добавить ControllerB.view как подпредставление ControllerA.
Если вы сначала не добавите ControllerB в качестве дочернего элемента ControllerA, то AutomaticForwardAppearanceAndRotationMethodsToChildViewControllers будет игнорироваться, а iOS5 по-прежнему будет вызываться, т. Е. Вы будете вызывать обратные вызовы контроллера представления дважды.
Пример в ControllerA:
- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
return NO;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.controllerB = [[ControllerB alloc] initWithNibName:@"ControllerB" bundle:nil];
[self.view addSubview:self.controllerB.view];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.controllerB viewWillAppear:animated];
}
В ControllerB NSLogging in viewWillAppear:
- (void)viewWillAppear:(BOOL)animated
{
NSLog("@ControllerB will appear");
}
Это приведет к тому, что iOS5 отобразит только это сообщение NSLog только дважды.т.е. вы автоматически ForwardAppearanceAndRotationMethodsToChildViewControllers были проигнорированы.
Чтобы исправить это, вам нужно добавить controllerB как дочерний элемент контроллера a.
Назад в класс ControllerA:
- (void)viewDidLoad
{
[super viewDidLoad];
self.controllerB = [[ControllerB alloc] initWithNibName:@"ControllerB" bundle:nil];
if ([self respondsToSelector:@selector(addChildViewController:)])
[self addChildViewController:self.controllerB];
[self.view addSubview:self.controllerB.view];
}
Теперь это будет работать, как и ожидалось, как в iOS4, так и в iOS5, не прибегая к ужасному взлому проверки строк версии iOS, но вместо этого проверяя, доступна ли нужная нам функция.
Надеюсь, это поможет.