3

我有 2 个版本的选项卡式 ios5 应用程序,一个使用情节提要创建,一个使用 xib 文件创建。故事板版本不调用该UITabBarControllerDelegate方法didSelectViewController(xib 版本调用)。故事板(我认为)缺少某些东西,但我不知道是什么。提出问题的另一种方式可能是——我如何引用UITabBarController故事板实例化的对象?

谢谢你的帮助。

编辑:标签栏控制器委托设置:

在 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 输出永远不会出现。在我看来,问题似乎是我没有正确引用故事板已实例化的选项卡栏控制器对象。我怎么做?

4

2 回答 2

8

我有这个问题。

如果您不使用情节提要,则可以UITabBarController在其中设置委托AppDelegate。但是,使用 时StoryboardsAppDelegate不知道tabBarController启动时在哪里。您会想到subclassingtabBarController添加委托方法:

(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];

这使我的标签栏委托方法能够运行。

疯了还是什么?

好的 - 我现在正在编辑这个答案,即使上面的内容都是正确的,在navigationController使用 a 的地方,每次tabBarButton触摸都会选择didSelectViewController,当您尝试NSLog(@"%@", viewController);仅向您显示您已选择UINavigationController该类时,委托方法将?

因此,为了增加更多复杂性,总的解决方案是UINavigationController为每个viewController要监视的对象子类化,(做某事)当tabBarbutton被触摸时。

无论如何它对我有用。而且,如果有人可以通过上面的运球来挑剔,他们可能会发现一个有用的方面——这对我来说已经足够了——因为我发现这个网站也非常有用。

于 2013-02-11T10:25:25.997 回答
6

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

于 2012-10-23T14:58:31.043 回答