如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?
如何从 appdelegate 显示 uiviewcontoller
如何从 Appdelegate 方法 applicationWillEnterForeground 重置 UISearch