iPhone UITabbar элемент дважды щелкните всплывающие контроллеры - PullRequest
6 голосов
/ 23 июня 2009

только что кое-что выяснил: если у вас есть панель вкладок, объединенная с NavigationController (у которой есть несколько представлений в его стеке), и вы дважды щелкаете TabBarItem, представление отображается на первом ViewController, нравится вам это или нет.

Есть ли способ предотвратить это?

Ответы [ 4 ]

5 голосов
/ 22 марта 2010

Вы, вероятно, не должны предотвращать это поведение. Это стандартное соглашение для пользовательского интерфейса iPhone, например нажатие на строку состояния для прокрутки к верхней части представления прокрутки.

Если вы действительно хотите это сделать, вы должны реализовать UITabBarController метод делегата -tabBarController:shouldSelectViewController:, как упоминалось в mckeed. Однако если у вас более пяти вкладок, selectedViewController может быть контроллером представления, который находится в разделе «Дополнительно», но vc будет [UITabBarController moreNavigationController]. Вот реализация, которая обрабатывает этот случай:

- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
    UIViewController *selected = [tbc selectedViewController];
    if ([selected isEqual:vc]) {
        return NO;
    }

    if ([vc isEqual:[tbc moreNavigationController]] &&
        [[tbc viewControllers] indexOfObject:selected] > 3) {
        return NO;
    }

    return YES;
}
1 голос
/ 23 января 2010

Я сам столкнулся с этой проблемой и нашел способ сделать это. Создайте делегат для вашего UITabBarController и внедрите tabBarController:shouldSelectViewController:, чтобы предотвратить выбор того же контроллера:

- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
  return tbc.selectedViewController != vc;
}

Вы также можете добавить более сложную логику, если хотите предотвратить ее только в некоторых случаях.

0 голосов
/ 10 мая 2010

Я согласен с тем, чтобы сохранить это поведение по назначению, но в то же время все становится интереснее, если аккуратно разматывать стек VC (например, при редактировании вложенной серии объектов Core Data). В моем случае это равносильно отмене каждого ВК.

Таким образом, есть ли какой-то способ для меня узнать, что мы выскакиваем вплоть до корневого VC? Я думаю, что операция отмены / отката во время viewWillDisappear не обрезает его, потому что тот же самый вид наверняка исчезнет и после сохранения. Мне нужно как-то транслировать "мы отменяем - выручайте!" когда выскочил весь путь до корневого ВК в данной вкладке. Проверка грязного / нового флага в качестве проверки безопасности в viewWillDisappear также не помогает, так как этот тест будет вызван дважды в случае законного отмены (т. Е. Если кнопка отмены действительно нажата).

0 голосов
/ 27 июля 2009

Единственный способ, который я нашел до сих пор, - это создать подкласс UINavigationController и переписать метод popToRootViewControllerAnimated для возврата nil.

Похоже, это метод, который UITabBar вызывает, когда вкладки дважды. Я не знаю, если это правильный путь ... Хотелось бы получить некоторые отзывы по этому вопросу ...

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    return nil;
}
...