UITabBarController 委托方法永远不会被调用

Posted

技术标签:

【中文标题】UITabBarController 委托方法永远不会被调用【英文标题】:UITabBarController delegate methods never get called 【发布时间】:2014-02-04 10:19:43 【问题描述】:

我目前正在重构我的 iPad 应用程序,而不是 NavigationBar 上的按钮,我想将注销按钮作为 TabBar 按钮项。

我所有的视图都在一个独特的 StoryBoard 中,所以我通过这种方式在我的 Appdelegate.m 中获取了我的 TabBar:

// Add logout tab to tabbar
storyboard                      = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UITabBarController *tabbar      = (UITabBarController *)[storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
[tabbar setDelegate:self];

当然委托协议是在我的 Appdelegate.h 中声明的

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

之后,我创建了一个空的 viewController 以创建我的注销选项卡:

UIViewController *logout        = [[UIViewController alloc]init];

然后我将 tabbar viewControllers 作为 NSMutableArray 并添加我的注销 VC:

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[tabbar viewControllers]];

[viewControllers addObject:logout];

最后我用我的新数组设置了标签栏视图控制器:

[tabbar setViewControllers:viewControllers];

我认为这些步骤是正确的。 那么为什么当我更改显示的选项卡时没有调用 didSelectViewController 呢?

如果有帮助,这是我的 didSelectViewController 方法(写在 AppDelegate.m 中)

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
    NSLog(@"onglet sélectionné : %d / %d", [tabBarController selectedIndex], [[tabBarController viewControllers]count]);
    //select the index where your logout button is
    if ([tabBarController selectedIndex] == [[tabBarController viewControllers]count]-1) 
        NSLog(@"logout");
    

提前感谢您的帮助!

【问题讨论】:

Swift answer 【参考方案1】:

[self setDelegate:self]; 放入您的 ViewDidLoad 或对象初始化的地方

【讨论】:

您的意思是在另一个 viewController 中设置委托?编辑我问这个是因为目前您在我的帖子中看到的所有代码都在 Appdelegate.m 中,并且该文件没有 viewDidLoad 方法 有效!我在另一个 viewController 中设置了委托,然后调用了该方法【参考方案2】:

尝试初始化标签栏对象;

// Add logout tab to tabbar
storyboard                      = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UITabBarController *tabbar      = [[UITabBarController alloc] init];
tabbar      = (UITabBarController *)[storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
[tabbar setDelegate:self];

【讨论】:

以上是关于UITabBarController 委托方法永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何从应用程序委托访问 uitabbarcontroller 内的 uinavigationcontroller 内的 uitableview?

将容器控制器(根视图控制器)设置为 UITabBarController 中视图控制器的委托

从ios中的UITabBarController中删除标签栏的安全方法

将 managedObjectContext 传递给 UITabBarController 问题

UITableView 永远不会在其委托上调用 tableView:shouldShowMenuForRowAtIndexPath:

iOS:请求 UITabBarController 旋转的最新解决方案