Здесь не хватает деталей. Как вы «обмениваетесь» двумя взглядами?
Если вы использовали UINavigationController в качестве контейнера, тогда viewWillAppear / viewDidAppear будет вызываться всякий раз, когда вы нажимаете / извлекаете новый viewController. Эти вызовы выполняются самим UINavigationController. Если вы используете UINavigationController, убедитесь, что у вас есть правильные прототипы для этих функций.
- (void)viewWillAppear:(BOOL)animated
Если вы пытаетесь реализовать иерархию представлений самостоятельно, то вам, возможно, потребуется выполнить эти вызовы самостоятельно как часть активации / деактивации представлений. Со страницы SDK viewWillAppear;
Если представление принадлежит представлению
контроллер добавлен в представление
иерархия напрямую, вид
контроллер не получит это
сообщение. Если вы вставляете или добавляете вид
в иерархию представлений, и она имеет
просмотреть контроллер, вы должны отправить
связанный контроллер представления это
сообщение напрямую.
Обновление:
С новыми подробностями проблема ясна: это ситуация, когда вы должны отправлять сообщения об исчезновении / появлении самостоятельно, как это предлагается в SDK. Эти функции не вызываются автоматически, когда представления вставляются / удаляются / изменяются напрямую, они используются кодом более высокого уровня (например, UINavigationController), который обеспечивает поддержку иерархии.
Если вы подумаете о своем примере использования exchangeSubView, то ничего не исчезает, просто один вид оказывается полностью или частично покрывающим другой, в зависимости от их областей и непрозрачности.
Я бы предложил, чтобы, если вы хотите поменять местами представления, вы действительно удаляете / добавляете по мере необходимости и вручную отправляете уведомления viewWillAppear / viewWillDisappear на их контроллеры.
1022 * Е.Г. *
// your top level view controller
-(void) switchActiveView:(UIViewController*)controller animated:(BOOL)animated
{
UIController* removedController = nil;
// tell the current controller it'll disappear and remove it
if (currentController)
{
[currentController viewWillDisapear:animated];
[currentController.view removeFromSuperView];
removedController = currentController;
}
// tell the new controller it'll appear and add its view
if (controller)
{
[controller viewWillAppear:animated];
[self.view addSubView:controller.view];
currentController = [controller retain];
}
// now tell them they did disappear/appear
[removedController viewDidDisappear: animated];
[currentController viewDidAppear: animated];
[removedController release];
}