-viewWillDisappear: метод - не лучшее место для изменения стека контроллера представления для вашего navigationController, потому что он запускается как при переключении вкладок, так и когда представление помещается поверх него.
Я немного поиграл с этим и обнаружил, что лучшее место для этого - метод [UITabBarControllerDelegate tabBarController: didSelectViewController:]. Итак, сначала вам нужно назначить объект делегатом для панели вкладок (я использовал делегат приложения). Свяжите свойство делегата вашего UITabBarController с объектом, реализующим протокол UITabBarControllerDelegate, в коде или в Интерфейсном Разработчике.
Затем реализуйте -tabBarController: didSelectViewController: метод. Теперь хитрость заключается в том, как определить, когда переключается вкладка «Адресная книга». Я отслеживал контроллер представления для рассматриваемой вкладки, используя свойство типа UINavigationController (корневой контроллер представления для вкладки). После привязки свойства tab1NavController к фактическому экземпляру с помощью Interface Builder его можно использовать для сравнения с параметром viewController, чтобы увидеть, какая вкладка была только что выбрана.
@interface Pop2RootTabSwitchAppDelegate : NSObject
<UIApplicationDelegate, UITabBarControllerDelegate> {
UINavigationController *tab1NavController;
}
@property (nonatomic, retain) IBOutlet UINavigationController *tab1NavController;
@end
@implementation Pop2RootTabSwitchAppDelegate
- (void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController {
NSLog(@"[%@ tabBarController:%@ didSelectViewController:%@]", [self class],
tabBarController, viewController);
if (viewController == tab1NavController) {
NSLog(@"viewController == tab1NavController");
[tab1NavController popToRootViewControllerAnimated:NO];
}
}