Выбранный индекс в представлении «more» панели UITabbar - PullRequest
5 голосов
/ 20 марта 2011

Как я могу управлять выбором пользователя в представлении «more» UITabBar? У меня есть этот код для управления выборами UITabBarItems:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {    
    if (!(viewController == tabBarController.moreNavigationController)) {
        int index = tabBarController.selectedIndex;
        [[DataManager sharedInstance] setCurrentTabbarIndex:index];
    }
}

Он отлично работает для видимых UITabBarItems, но когда пользователь выбирает какой-то элемент в представлении «больше», я никогда не получаю информацию об этом. Есть ли какой-нибудь способ отловить пользовательский элемент в представлении «больше»? Спасибо!

Ответы [ 4 ]

2 голосов
/ 25 мая 2013

Очень поздний ответ на очень старый вопрос, но в любом случае, если кто-то на это наткнется

Решение состоит в том, чтобы назначить себя делегатом контроллера «more». У вас уже есть класс, который принимает протокол UITabBarControllerDelegate, поэтому файл .h может выглядеть следующим образом:

@interface MyDelegate : NSObject <UITabBarControllerDelegate, UINavigationControllerDelegate>
{
}

Где бы вы ни назначали свой класс делегатом, сделайте это:

- (void) assignDelegate:(MyDelegate)myDelegate toTabBarController:(UITabBarController*)tabBarController
{
  tabBarController.delegate = myDelegate;
  tabBarController.moreNavigationController.delegate = myDelegate;
}

И, наконец, в вашем классе делегата добавьте этот метод:

- (void) navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated
{
     // add code to handle the event
}

Обратите внимание, что ни один из ваших методов делегата не вызывается при программном изменении вкладок.

2 голосов
/ 20 марта 2011

Представление «more» UITabBarController обрабатывается отдельно от других представлений.Обсуждение Apple на эту тему гласит следующее:

[Свойство 'moreNavigationController'] всегда содержит допустимый контроллер навигации More, даже если кнопка Больше не отображается на экране. Вы можете использовать значение этого свойства, чтобы выбрать контроллер навигации More в интерфейсе панели вкладок или сравнить его с текущим выбранным контроллером представления .

Не добавлять объект, сохраненный в этомсвойство интерфейса панели вкладок вручную.Контроллер More отображается автоматически контроллером панели вкладок по мере необходимости.Вы также не должны искать контроллер навигации More в массиве контроллеров представления, хранящихся в свойстве viewControllers.Контроллер панели вкладок не включает контроллер навигации More в этот массив объектов.

Судя по этому, я думаю, что вы можете сделать что-то вроде:

int index = tabBarController.selectedIndex;
if (tabBarController.selectedViewController == 
    tabBarController.moreNavigationController) {
    index = -1;  //assign some placeholder index for the "More" controller
}
1 голос
/ 12 января 2016

Лучший подход, который я нашел для этой проблемы, состоит в том, чтобы стать делегатом для UITableView, который является topViewController в UITabBarController.moreViewController.Реализация didSelectRowAtIndexPath должна решить проблему!

Лучшая (и наиболее безопасная) реализация для этого описана Стюартом Шарпом в его блоге: http://initwithstyle.net/2014/02/making-more-of-the-more-view/

0 голосов
/ 24 января 2013

Какой бы вид ни был выбран, он получит viewWillAppear:animated:

Предоставьте это в каждом представлении, контролируемом вашей панелью вкладок, и, таким образом, вы сможете извлечь личность выбранного пользователя, даже если он сделан из контроллера "More".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...