选项卡控制器(故事板模板)和AppDelegate

4
当我使用故事板在XCode 4中创建一个TabBarController的iPhone模板时,它会自动配置主视图控制器等一切内容。但是在AppDelegate中没有Tab Bar Controller的属性。我可以为它创建一个输出口,并尝试将其与我的故事板中的Tab Bar Controller链接起来,但这是不可能的。是否有更好的方法在didFinishLaunchingWithOptions方法中访问Tab Bar Controller,因为它已经被连接了呢?我想要的是self.currentController = Tab Bar Controller中的当前选项卡。

AppDelegate.h:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

AppDelegate.m:

@interface AppDelegate()

@property (nonatomic, assign) UIViewController<SubViewContainer> *currentController;

@end

@synthesize window = _window
@synthesize currentController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

//I need this piece of code to equal the Tab Bar Controller current tab
self.currentController = ?

return YES;
}

//And I'm gonna use this void for some statements about the Tab Bar Controller tabs:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:
(UIViewController *)viewController
{
// with some statements
}
2个回答

19

假设你的storyboard已经按预期设置,那么这应该会在didFinishLaunchingWithOptions:中给你一个对标签栏控制器的引用:

Assuming things are set up in your storyboard as expected, this should give you a reference to the tab bar controller in didFinishLaunchingWithOptions::
NSLog(@"Root: %@", self.window.rootViewController);
UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;

通常情况下,您可以使用...获取当前控制器。

self.currentController = [tabController selectedViewController];

但是因为在执行此方法时还没有选择控制器,所以我们最好的猜测是您想要的是...

self.currentController = [[tabController viewControllers] objectAtIndex:0];

好的,如果我想要self.currentController =当前Tab Bar Controller选项卡中的控制器,您有什么建议? - ingenspor
一旦您拥有选项卡控制器,您可以获取其 selectedViewController 属性。这是您所询问的吗? - Phillip Mills
我更新了我的问题,使其更清晰。我是新手,不太明白如何在我的代码中使用您的答案,但是在日志中看起来是正确的,因为它显示根:UITabBarController。 - ingenspor
谢谢!它已经接近了,但是它说:“使用UIViewController类型的表达式初始化UITabBarController时,指针类型不兼容。”也许我必须将TabBarController作为主窗口的子视图添加进去? - ingenspor
将你要分配的值转换一下类型,以消除编译器警告。它只是在抱怨你知道控制器的类型而它不知道。 :-) - Phillip Mills

2
使用self.window.rootViewController.tabBarController来访问该视图控制器的标签栏控制器。

但在这种情况下,self不是视图控制器。 - Phillip Mills
我猜你是想从App Delegate访问选项卡栏控制器。请尝试使用更新的代码。 - The Kraken
是的,这就是我想要做的。但是将self.window.rootViewContoller.tabBarController粘贴进去并不起作用。我从appdelegate中删除了tabBarController的属性/合成/委托代码,因为我不应该创建一个。但是我仍然无法引用我的剩余代码中的appdelegate,尽管它显示"Root: UITabBarController"如果我NSLog self.window.rootViewController。 - ingenspor
看起来@PhillipMills的答案解决了问题。这似乎是一个更加优雅的解决方案。如果我的理解有误,我深感抱歉。很高兴问题得到解决! - The Kraken

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