【问题标题】:Tab Bar Controller (storyboard template) and AppDelegate标签栏控制器(故事板模板)和 AppDelegate
【发布时间】:2012-07-27 09:52:41
【问题描述】:

当我使用情节提要为 TabBarController 创建 XCode 4 iPhone 模板时,它会自动配置主视图控制器和所有内容。但是 AppDelegate 中的选项卡栏控制器没有属性。我可以为它创建一个插座,并尝试将它与我的故事板中的标签栏控制器链接,但这是不可能的。有没有更好的方法来访问 didFinishLaunchingWithOptions 方法中的选项卡栏控制器,因为它已经有点连接了?我想要的是 self.currentController = 标签栏控制器中的当前标签。

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
}

【问题讨论】:

    标签: iphone xcode delegates uitabbarcontroller storyboard


    【解决方案1】:

    假设您的情节提要按预期设置,这应该为您提供对didFinishLaunchingWithOptions: 中的标签栏控制器的引用:

    NSLog(@"Root: %@", self.window.rootViewController);
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
    

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

    self.currentController = [tabController selectedViewController];
    

    ...但是由于在此方法执行时尚未选择任何控制器,因此您想要的最佳猜测是...

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

    【讨论】:

    • 好的,谢谢,如果我想要 self.currentController = 标签栏控制器中的当前标签,有什么建议吗?
    • 一旦你有了标签栏控制器,你就可以得到它的selectedViewController属性。你问的是这个吗?
    • 我更新了我的问题,以便更清楚。我是新手,所以我不太明白如何在我的代码中使用你的答案,但它在日志中看起来很正确,因为它说 Root: UITabBarController。
    • 谢谢!它越来越接近,但它说“不兼容的指针类型使用 UIViewController 类型的表达式初始化 UITabBarController。”也许我必须以某种方式将 TabBarController 添加为主窗口的子视图?
    • 强制转换您分配的值以消除编译器警告。它只是抱怨你知道控制器的类型而它不知道。 :-)
    【解决方案2】:

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

    【讨论】:

    • self 在这种情况下不是视图控制器。
    • 我假设您正在尝试从 App Delegate 访问标签栏控制器。试试更新的代码。
    • 是的,这就是我想要做的。但是在那里粘贴 self.window.rootViewContoller.tabBarController 是行不通的。我从 appdelegate 拿走了我的 tabBarController 属性/合成/委托代码,因为我不应该创建一个。但是我仍然无法在 appdelegate 中引用我剩下的一个,尽管它说“Root: UITabBarController if i NSLog self.window.rootViewController.
    • 看起来@PhillipMills 的回答成功了。它看起来像一个更优雅的解决方案。如果我对您的确切要求感到困惑,我深表歉意。很高兴它成功了!
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2014-07-30
    相关资源
    最近更新 更多