У меня есть UITabBarController с массивом UINavigationControllers (например, приложение iPod), так что я могу переключать вкладки, и на каждой вкладке есть стек контроллеров представления.
Я хочу иметь возможность отображать все представленияконтроллеры возвращаются в корень, если пользователи касаются новой вкладки, поэтому реализовали метод делегата UITabBarController:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
// Pop all view controllers back to the root view controller
for (UINavigationController *nc in tabBarController.viewControllers){
[nc popToRootViewControllerAnimated:NO];
}
}
Чтобы проверить, что это работает должным образом, я поставил точку останова на метод dealloc моих различных viewControllers.
Кажется, вкладка, которую я переключаю на всплывающие окна, на контроллер корневого представления, но вкладка, с которой я переключаюсь, этого не делает.Я что-то упускаю здесь очевидное?У меня есть 4 вкладки, и цикл for выполняется 4 раза и выполняет 4 отдельных вызова popToRootViewController.
Причина, по которой это важно, заключается в том, что если я нахожусь в rootViewController, то для меня безопасно обновлять базовую базу данных безоставляя пользователя в представлении, которое больше не имеет смысла или является действительным.Например, в корне есть таблица элементов, прикосновение к элементу дает вам подробную информацию об этом элементе.Если пользователь касается другой вкладки, контроллер представления подробностей все еще находится в памяти.Если приложение получит обновление, в котором эта запись больше не действительна, то возврат на нее приведет к сбою или противоречивому состоянию.
Надеюсь, что это имеет смысл, и любая помощь будет полезна, даже если это просто идеи о том, какдля устранения проблемы.
С уважением
Дейв
PS
Все это связано с тем, что мое приложение проверяло наличие обновлений при запускеиз старой базы данных и использовать новую.С iOS4 и выше мое приложение больше не убивается, поэтому нужно также проверить наличие обновлений в applicationWillEnterForeground, главное отличие в том, что приложение не находится в известном состоянии.