我有两个版本的选项卡式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输出永远不会出现。在我看来,问题是我没有正确引用已经由故事板实例化的标签栏控制器对象。 我该怎么做?
答案 0 :(得分:8)
我有这个问题。
如果您没有使用情节提要,那么在UITabBarController
中设置AppDelegate
代理是可行的方法。但是,对于Storyboards
,AppDelegate
不知道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
或对象初始化的地方