如何从 AppDelegate.m 访问 tabBarController?

Posted

技术标签:

【中文标题】如何从 AppDelegate.m 访问 tabBarController?【英文标题】:How to access tabBarController from AppDelegate.m? 【发布时间】:2014-11-25 20:06:03 【问题描述】:

这是我的故事板:

我正在尝试从 AppDelegate.m 中的方法访问 tabBarController

这是 AppDelegate.h:

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
#import "STAlertView.h"


@interface demo_AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) STAlertView *av;

@end

这是 AppDelegate.m:

#import "demo_AppDelegate.h"
#import "demo_Friends_ViewController.h"


@implementation demo_AppDelegate
-(void)showFriendReqAlert:(NSNotification *)pNotification
    NSLog(@"Hello from showFriendReqAlert:");
    NSLog(@"Root: %@", [self.window.rootViewController.navigationController.tabBarController viewControllers]);


....
....
....
....
@end

我的主要动机是当调用此方法showFriendReqAlert: 时,第三个标签栏项目Friends 会显示一个红色徽章。但是每当我尝试选择 tabBarItem 时,它会在 NSLog 中显示为 null。

我还尝试了以下方法: self.window.rootViewController.navigationController.tabBarController self.window.rootViewController.tabBarController

但没有任何效果。有什么帮助吗?

谢谢!

【问题讨论】:

登录屏幕和标签栏之间的导航控制器的作用是什么?你从登录中使用什么样的segue?您的登录屏幕未嵌入导航控制器中,因此我希望 self.window.rootViewController.navigationController 为零。 我也有同样的问题。 RootViewController 是登录屏幕,我想在收到通知后更改徽章。你的问题解决了吗? 【参考方案1】:

我相信(很抱歉在这里相信 ;-) TabBarController 应该是您的第一个控制器,而您的 navigationBarController 必须在之后出现,因为它对 navigationController 没有多大意义(如果您更改选项卡)推/弹出。

我建议您删除您的第一个DemoViewController 并关注NavigationController,并且您的第一个控制器是您的TabBarController(只需在 IB 中设置“是初始视图控制器”)。

然后你可以像这样访问你的tabBar

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;

斯威夫特 5:

guard let tabBarController = window?.rootViewController as? UITabBarController else  return 

【讨论】:

谢谢,但第一个DemoViewController 是带有登录屏幕的那个。所以,它必须在那里。 好的。您是否尝试从登录屏幕访问您的 tabBar?在您看到它之前,它可能尚未加载。 不,不是来自登录屏幕,我实际上是在后台获取后尝试更改标签栏项目。所以,我是从 AppDelegate.m 内部做的 你有没有试过检查什么变量是 nil: UINavigationController* nav = self.window.rootViewController.navigationController;如果导航!= nil UITabBarController* tbc = nav.tabBarController; ... 真的是 tabBarController 吗?

以上是关于如何从 AppDelegate.m 访问 tabBarController?的主要内容,如果未能解决你的问题,请参考以下文章

如何从appdelegate调用方法[重复]

如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?

如何从 appdelegate 显示 uiviewcontoller

如何从 Appdelegate 方法 applicationWillEnterForeground 重置 UISearch

如何将数据从 AppDelegate 传递到 ViewController?

无法从 appdelegate.m 为 NSProgressIndicator 设置动画