从UIVIewController访问UITabBarController

我正在开发一个基于UITabbar和视图层次结构的应用程序,如下所示。

UITabBarController —-> UINavigationController —-> UIViewController

我需要从UIIVewController访问UITabBarController。 但是下面的属性总是返回nil。

self.tabBarController和self.navigationController.tabBarController

有没有一种方法来直接访问TabbarController从一个子ViewController而不使用AppDelegate?

@implementation HomeViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization self.title = @"Home"; self.navigationItem.title = @"Home"; self.tabBarItem.image = [UIImage imageNamed:@"TabBarHome"]; UITabBarController *tab = self.tabBarController; UITabBarController *tab1 = self.navigationController.tabBarController; UITabBarController *tab2 = self.navigationController.presentingViewController; } return self; } 

随着您正在使用的层次:

在这里输入图像说明

我可以在没有问题的情况下访问ViewControllerUITabBarController

self.tabBarController

将您的自定义初始化移动到viewDidLoadviewDidAppear

那么对于你可以使用self.tabBarController访问TabBarController

到达您的TabBarController的另一种方法是:

 UITabBarController *tabBarController = (UITabBarController *)[[[UIApplication sharedApplication] delegate] window].rootViewController; 

但是你的情况完全没有必要。

编辑:

如果你正在使用Xib,那么你已经在你的AppDelegate中以编程方式创build了一个TabBarController。 我相信你有这样的东西:

self.tabBarController = [[UITabBarController alloc] init];

然后你可以在你的ViewController中调用它:

 AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate] UITabBarController *tabBarController = appdelegate.tabBarController; 

你做错了。

我有一个与你的应用程序相同。 我可以从viewDidLoad访问tabbar。

尝试这个:

 - (void)viewDidLoad { [super viewDidLoad]; [self.tabBarController setSelectedIndex:1]; } 

希望这可以帮助.. :)