Элемент iPhone UITabbar при двойном щелчке вызывает контроллеры всплывающих окон

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

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


person Chris    schedule 23.06.2009    source источник


Ответы (4)


Вы, вероятно, не должны предотвращать такое поведение. Это стандартное соглашение пользовательского интерфейса 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;
}
person lemnar    schedule 22.03.2010
comment
Я также рекомендую не предотвращать такое поведение без ОЧЕНЬ веских причин. Пользователи злятся, когда общесистемный ярлык недоступен. - person Brandon Bodnar; 22.03.2010

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

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

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

person mckeed    schedule 22.01.2010

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

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

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    return nil;
}
person Jakob Dam Jensen    schedule 27.07.2009

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

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

person Joe D'Andrea    schedule 10.05.2010
comment
Ах-ха. Сначала я думал, что категории — ваш друг, и, возможно, я мог бы настроить один из них на UIViewController и вмешаться в popToRootViewControllerAnimated: для предупреждения войск. Но вместо этого потребовалось бы создание подклассов, не так ли. (Я стараюсь избегать подклассов в Cocoa, когда это возможно, но это может быть не тот случай, когда это возможно.) Если есть менее нагруженный энтропией способ обойти это, я весь внимание. - person Joe D'Andrea; 10.05.2010