选项卡控制器委托未起作用

3

有人能帮我吗?当我使用我的UITabBarController委托时,它没有起作用。

我像这样调用了一个委托方法:

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

 [self.navigationController popToRootViewControllerAnimated:NO];
}

什么出了问题?是什么都没有发生还是崩溃了?你是否在方法中设置了断点以查看它是否被调用,或者这就是你的问题?我们需要更多信息 :) - deanWombourne
你是否正确添加了委托? - willcodejavaforfood
请在提问时具体说明问题。如果您在几天后再看您的问题,可能会感到困惑 : )。因此,请在提问时提供更多信息,以便您可以得到您真正想要的答案 :)。 - Manjunath
5个回答

12

如果您正在子类化UITabBarController,则...奇怪的是...您可以通过将其自身设置为代理来使其工作:

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

然后didSelectViewController操作将正常触发:

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

别忘了将你的UITabBarControllerDelegate类添加到.h文件中:

@interface MyTabBarController : UITabBarController <UITabBarControllerDelegate>

@end

1
是的,当一个控制器也是它自己的代理时,它需要一个委托确实看起来很违反直觉。 - HairOfTheDog
1
我按照上述步骤操作,但没有成功。我正在以编程方式处理UITabBar。 - Akhtar

3

如果您正在通过扩展UITabBarController来自定义选项卡栏,并试图以编程方式更改选项卡栏的选中索引,则不会调用委托。

请查看"UITabBarDelegate"内部的注意事项:

// Note: called when a new view is selected by the user (but not programmatically)

1
这是大多数与此委托未触发相关的问题的正确答案。+1 - Lee Probert

1

这可能会对你有所帮助

-(void)applicationDidFinishLaunching:(UIApplication *)application {
    tabBarController.delegate=self;
    // Add the tab bar controller's current view as a subview of the window
    [window addSubview:tabBarController.view];
}

0

指定

.h文件中的UITabbarcontrollerDelegate

然后

-(void)applicationDidFinishLaunching:(UIApplication *)application {

tabBarController.delegate=self;

// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];
}

0

阅读文档以更深入地了解导航控制器、选项卡控制器、视图和导航层次结构之间的关系。

然后查看您提供的代码。哪个视图/控制器是容器?您正在弹出self的navigationController,而它与tabBarController不同。如果要在选项卡之间切换,则我认为您实际上不需要此方法。

尝试注释掉此方法。这是UITabBarController委托协议中的可选方法。如果您将其注释掉,则应该获得选项卡控制器的默认行为,即选择适当的视图控制器并切换到新视图。

通常情况下,只有在希望在视图控制器之间切换时执行某些操作时才需要使用此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接