Вопрос по objective-c – Как реализовать didSelectViewController

3

Я хочу поймать событие, когда кто-то переключается между вкладками. У меня есть следующие две функции в моем файле appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController * uitbc = [storyboard instantiateViewControllerWithIdentifier:@"tabbarcontroller"];
    uitbc.delegate = self;
    [self.window addSubview:uitbc.view];

    return YES;
}


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

НоNSLog(@"switching"); никогда не стреляет Xcode выдает предупреждение для строкиuitbc.delegate = self; поговорка "Передача appdelegate const__strong параметру несовместимого типа id".

Что я делаю неправильно? Я просто следую принятому ответу, найденному здесь, за исключением того, что я инстанцирую свою панель рассказов формы tabbarcontroller:

как получить событие, которое переключает вкладку меню на iphone

Update Основываясь на предложении скрама, я написал это для моего приложения appdelegate, но NSLOG (Переключение) все еще не запускает:

@interface johnAppDelegate : UIResponder <UITabBarControllerDelegate>

Я также обновил свой didFinishLauchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
tabBarController = self.window.rootViewController.tabBarController;
tabBarController.delegate = self;
[window addSubview:tabBarController.view];
}

Хорошо, что ничего не падает. У меня тоже больше нет предупреждения о несовместимых типах. Но все же didSelectViewController не срабатывает.

Ваш Ответ

3   ответа
4

в моем файле appdelegate.h я изменил строку

@interface wscAppDelegate : UIResponder <UIApplicationDelegate>

в

@interface wscAppDelegate : UIResponder <UIApplicationDelegate,UITabBarControllerDelegate>

Затем в моем CustomTabBarController в функции viewDidLoad я добавил эти строки:

wscAppDelegate *appDelegate = (wscAppDelegate *)[[UIApplication sharedApplication] delegate];
self.delegate = appDelegate;

Затем в файле appdelegate.m я добавил эту функцию

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

NSLog(@"hooray this works");

}
0

Вам нужно, чтобы ваш AppDelegate соответствовалUITabBarControllerDelegate протокол. Увидеть ниже..

@interface YourAppDelegate : UIResponder <UITabBarControllerDelegate>
Вы все еще получаете предупреждение?
Все еще не стреляет. Я обновил свой вопрос, чтобы отразить это. Есть еще идеи? Спасибо John
Предупреждение ушло, так что это хорошо. Может быть, я до сих пор не установил некоторые отношения между моим делегатом приложения и правильным tabbarcontroller? John
2

Я также много боролся с этим, но мой UITabBarNavigationController довольно далек от AppDelegate, чтобы установить его там, и единственный способ действительно заставить его работать - это сделать это.not в viewDidLoad самого подкласса UITabBarController, но в его:

-(void)viewDidLayoutSubviews {
    [ super viewDidLayoutSubviews ];
    self.delegate = self;
}

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

Похожие вопросы