没有调用didSelectViewController方法(带故事板)

时间:2012-06-16 17:31:18

标签: ios ios5 uitabbarcontroller storyboard

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

2 个答案:

答案 0 :(得分:8)

我有这个问题。

如果您没有使用情节提要,那么在UITabBarController中设置AppDelegate代理是可行的方法。但是,对于StoryboardsAppDelegate不知道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];

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

疯狂还是什么?

好的 - 我现在正在编辑这个答案,因为尽管上面的内容都是正确的,但正在使用navigationController,每个tabBarButton触摸时选择didSelectViewController代表当您尝试NSLog(@"%@", viewController);时,只会显示您已选择UINavigationController类?

因此,只是为了增加更多复杂性,整个解决方案是在UINavigationController已经被viewController的时候为你要监视的每个tabBarbutton继承{{1}}。感动。

无论如何它对我有用。并且,如果有人能够通过上述运球挑选出来,他们可能会找到一个有用的方面 - 这对我来说足够了 - 看到我发现这个网站也非常有用。

答案 1 :(得分:6)

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