Определить, какая вкладка была выбрана в TabBarController изнутри TableViewController - повторное использование кода - PullRequest
1 голос
/ 22 января 2012

У меня есть приложение, которое имеет 5 вкладок на TabBarController. Для простоты предположим, что это Tab A, B, C, D и E. Каждая вкладка ведет пользователя к TableViewController, который встроен в контроллер навигации. Каждая вкладка также имеет свои собственные файлы .h и .m. Код по большей части очень похож на 5 вкладок. Я хочу покончить с этими 5 наборами файлов классов и просто использовать 1 комплект. Это облегчит мне внесение изменений в приложение (в 1 месте вместо 5 мест). Как я могу определить в одном файле реализации, какая вкладка была выбрана? Как только я узнаю, что могу применить логику для отображения таблицы, для которой была выбрана вкладка ...

Еще одна вещь, которую я должен упомянуть, это то, что мне нужно обнаружить выбранную вкладку в TableViewController. TabBarController является точкой входа для приложения, и у меня нет подкласса TabBarController.

Я пробовал этот код в TableViewController, однако он не доступен и / или не используется.

в .h файле:

@interface MyController : UITableViewController <UITabBarDelegate>

в .m файле:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    //NSLog(@"selectedIndex: %d", self.tabBarController.selectedIndex);

    NSLog(@"didSelectItem: %d", item.tag);
}

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Легко, у вас уже есть решение!

tabBarController

Родитель или предок, который является контроллером панели вкладок.(только для чтения)

@ свойство (неатомное, только для чтения, сохранение) UITabBarController * tabBarController

Обсуждение Если получатель добавлен в контроллер панели вкладок, это свойство является контроллером панели вкладок.Если контроллер навигации получателя добавлен в контроллер панели вкладок, это свойство является контроллером панели вкладок контроллера навигации.Если панель вкладок отсутствует или получатель является модальным представлением, это свойство равно nil.

Это означает, что любой viewController, добавляемый в контроллер панели вкладок, имеет это свойство, заполненное системой.

Затем в контроллере вида, который вы хотите использовать для вкладки, вы реализуете viewWillAppear

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSUInteger selectedIndex = self.tabBarController.selectedIndex;
    switch (selectedIndex) {
        case 0:
            //configure me
            break;
        case 1:
            //configure me differently!!
            break;

        default:
            break;
    }
}    

В свете комментариев это свойство tabBarController не выглядит надежным.

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

В качестве альтернативы вы можете загрузить каждую вкладку с тем же классом, но с другим символом xib.,Вы можете установить свойства на вашем контроллере представления в разделе «пользовательские атрибуты времени выполнения» в конструкторе интерфейса.Затем в блоке viewWillAppear просто проверьте свойство, установленное xib для этого экземпляра.

0 голосов
/ 22 января 2012

Если я вас правильно понял, у вас есть много вариантов:
- вы можете переопределить метод init в вашем m-файле, который, я думаю, инициализирует UITableViewCOntroller и передать ему дополнительный параметр в зависимости от того, на какой вкладке вы находитесь.

  • Вы также можете добавить свойство tabid к этому классу и установить его при создании его для каждой вкладки (что-то, что показывает, на какой вкладке вы находитесь).

  • Вы также можете использовать уведомления (но это не будет самым простым или лучшим решением, если у вас нет веских причин не использовать первые два)

  • Я уверен, что есть много других способов.

...