Проблема с подключением к корневому навигационному контроллеру на переключателе панели вкладок - PullRequest
4 голосов
/ 01 мая 2009

Попытка имитировать / копировать встроенную адресную книгу, особенно поведение при редактировании контакта или просмотре информации о существующем контакте из приложения «Телефон». Когда вы переходите на другую вкладку, состояние редактирования сбрасывается, а представление «Новый контакт» или «Информация» появляется так, что когда вы возвращаетесь на вкладку «Контакты», вы возвращаетесь к представлению корневой таблицы.

У меня большая часть работы внутри viewWillDisappear с использованием setEditing: и popToViewController: однако я получаю странное поведение, когда пользователь переходит от представления Info к представлению таблицы с помощью кнопки назад. Даже если я загляну в контроллер представления корневой таблицы, он, похоже, использует класс UITableViewController по умолчанию, а не мой подкласс (например, стандартное поведение выбора вместо моих переопределений, чтобы выдвинуть детальное представление.)

Есть подсказки? IPD

Вот некоторый код для иллюстрации:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // This is to clean up from the colored bar in detail view
    self.navigationController.navigationBar.tintColor = nil;

    // These are to match the behaviour of Contacts app
    [self setEditing:NO animated:NO];

    // This is the tricky part: works when switching tabs, but not when back button was going to pop anyway!!
    [self.navigationController popToViewController:rootViewControllerForTab animated:NO];
}

1 Ответ

5 голосов
/ 03 мая 2009

-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];
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...