2012-06-16 3 views
3

У меня есть 2 версии приложения с вкладками ios5, созданные с помощью раскадровки и один с помощью xib-файлов. Версия раскадровки не вызывает метод UITabBarControllerDelegatedidSelectViewController (версия xib). Что-то (я думаю) отсутствует в раскадровке, но я не знаю, что. Другой способ постановки вопроса может заключаться в следующем: как я могу ссылаться на объект UITabBarController, созданный при помощи раскадровки?didSelectViewController метод не вызывается (с раскадрой)

Благодарим за помощь.

EDIT: Делегат панель вкладок контроллер установлен:

В AppDelegate.h:

@interface MyAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> 
@property (strong, nonatomic) UITabBarController *tabBarController; 

В AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.tabBarController.delegate = self; 
    return YES; 
} 

Позже в AppDelegate.m, то делегат:

- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    NSLog(@"Got Here"); 
} 

Выход NSLog никогда не появляется. Кажется, что проблема заключается в том, что я неправильно ссылаюсь на объект контроллера панели вкладок, который был создан с помощью раскадровки. Как это сделать?

+0

Вы установили делегат? Можете ли вы показать код? – Pfitz

+0

Депозит панели вкладок установлен в AppDelegate.h: – whawk

+0

Dud u узнайте об этом. У меня такая же проблема. – ingenspor

ответ

6

Положите [self setDelegate:self]; в вашем ViewDidLoad или где-нибудь, где объект получить инициализируется

+0

Вы имеете в виду, что я должен добавить выше метод в моем первом ViewController первого NavigationController TabBarController? не могли бы вы рассказать о своем решении. – Pratik

8

Я имел этот вопрос.

Если вы не используете раскадровки, то установить UITabBarController делегат в AppDelegate - это путь. Однако, с Storyboards, AppDelegate не знает, где находится tabBarController. Можно подумать, что по subclassing в tabBarController и добавив метод делегата:

(void)tabBarController:(UITabBarController *)tabBarController 
    didSelectViewController:(UIViewController *)viewController { 

} 

... было бы достаточно. Но это раздражает.

Мне нужно было знать, когда пользователь нажал кнопку вкладки. Мне нужно было знать это больше, что мне нужно было знать, что был запущен метод viewController «- (void)viewWillDisappear:(BOOL)animated {} ».

Я решил сделать свой UITabBarController делегатом сам по себе. Это, казалось, глупо для меня, но я сделал следующее ...

#import <UIKit/UIKit.h> 

@interface PlumbsTabBarController : UITabBarController <UITabBarControllerDelegate> 

@end 

А потом, в моем viewDidLoad метода, написал следующее:

[self setDelegate:self]; 

что позволило моим вкладкам методов бара делегата для запуска.

Сумасшедший или что?

Ok - я редактирую этот ответ сейчас, даже несмотря на то выше все правильно, где navigationController используются, выбирается с каждым tabBarButton прикоснулся, метод didSelectViewController делегата, при попытке NSLog(@"%@", viewController); только показать вам что вы выбрали класс UINavigationController?

Таким образом, общее решение, просто добавить больше сложности, является подкласс UINavigationController для каждого viewController, который вы хотите контролировать, (сделать что-то), когда tabBarbutton была затронута.

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

+0

Спасибо, ваш ответ сработал для меня. –

+0

В моем случае этот ответ работал только в том случае, если метод 'didSelectViewController' также находился в файле' UITabBarController', а не AppDelegate. –

Смежные вопросы