web-dev-qa-db-ja.com

UIVIewControllerからUITabBarControllerにアクセスする

以下のように、UITabbarとビュー階層に基づいたアプリケーションを開発しています。

UITabBarController ----> UINavigationController ----> UIViewController

UIIVewControllerからUITabBarControllerにアクセスする必要があります。ただし、以下のプロパティは常にnilを返します。

self.tabBarControllerおよびself.navigationController.tabBarController

AppDelegateを使用せずに子viewControllerから直接Tabbarcontrollerにアクセスする方法はありますか?

@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;
}
18
rustylepord

あなたが使っている階層で:

enter image description here

私はUITabBarControllerからViewControllerに問題なくアクセスできます:

self.tabBarController

カスタム初期化をviewDidLoadまたはviewDidAppearに移動します

次に、shureの場合、TabBarControllerself.tabBarControllerでアクセスできます。

TabBarControllerに到達する別の方法は次のとおりです。

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

しかし、それはあなたの場合には全く不要です。

編集:

Xibを使用している場合は、AppDelegateにプログラムによってTabBarControllerが作成されています。私はあなたが次のようなものを持っていると確信しています:

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

次に、それをViewControllerで呼び出すことができます。

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

あなたはそれを誤解している。

私はあなたと同じアプリを持っています。 viewDidLoadからタブバーにアクセスできます。

これを試して:

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

お役に立てれば.. :)

5
Rashad