如何从另一个View Controller访问Tab View Controller

时间:2013-12-20 01:02:45

标签: objective-c ios7 uistoryboard xcode-storyboard xcode5.0.1

my storyboard我无法访问标签栏控制器下的视图控制器。这是我的故事板的样子:

  1. 查看控制器A( - > Page View Controller - > View Controller C
  2. 查看控制器A - >标签栏控制器(MyTabBarController.h / .m) - >导航控制器(MyNavigationController.h / .m) - >查看控制器B(TabViewController.h / .m)
  3. 标签栏控制器(MyTabBarController.h / .m) - >查看控制器D
  4. 标签栏控制器(MyTabBarController.h / .m) - >查看控制器E
  5. 从View Controller A我有一个名为loginButton的IBAction,它连接到Tab Bar Controller,目前它看起来像这样:

    - (IBAction)loginButton:(id)sender {
    
        MyNavigationController *localNavigationController;
    
        UIStoryboard * storyboard = self.storyboard;
    
        MyTabBarController *tbc = [[MyTabBarController alloc] init];
    
        NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:1];
    
        TabViewController *login = [storyboard instantiateViewControllerWithIdentifier: @ "TabViewController"];
    
        localNavigationController = [[UINavigationController alloc] initWithRootViewController:login];
    
        localNavigationController.delegate = self;
    
        [localControllersArray addObject:localNavigationController];
    
    
        tbc.viewControllers = localControllersArray;
    
    
        tbc.delegate = self;
        tbc.moreNavigationController.delegate = self;
    
    
        tbc.selectedIndex = 0;
    
        [self presentViewController:tbc animated:YES completion:^{
    
        }];
    
    }
    

    我无法正确显示。我在这段代码中收到了一堆警告。并且它也没有显示标签栏底部的不同标签项,即使我已在每个标签上放置图像/文字。

    那么如何正确显示/访问标签栏控制器内的视图控制器? (即视图控制器C / D / E)?

3 个答案:

答案 0 :(得分:4)

您在问题中显示的故事板已经包含正确连接的标签栏控制器,导航控制器和登录控制器。因此,您不应该在代码中实例化新的选项卡栏控制器或导航控制器 - 当您实例化选项卡栏控制器时,它们将由故事板实例化。因此,您唯一需要做的就是给故事板中的标签栏控制器一个标识符,并执行此操作(假设标识符名为MyTabBarController):

- (IBAction)loginButton:(id)sender {
    UITabBarController *tbc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyTabBarController"];
    [self presentViewController:tbc animated:YES completion:nil];
}

如果您控制从“登录”按钮拖动到标签栏控制器,并选择“模态”,则甚至不需要此代码。这将创建一个模态segue,它将显示标签栏控制器,根本没有代码。

答案 1 :(得分:0)

如果您只想从tabBar控制器中选择另一个选项卡,请使用以下内容:

UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController;
[tabBar setSelectedIndex:3];

请注意,如果tabBar控制器是初始视图控制器,您可以使用applicationDidFinishLaunching方法获取它的实例并将其存储在AppDelegate中。然后你就可以像这样访问它:

 MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

请记住导入AppDelegate.h

答案 2 :(得分:0)

我建议您使用Singleton共享实例从多个控制器共享多个信息。 这是一个很好的设计模式供您使用。 我在可可上写了设计模式用法的样本(参见https://github.com/leverdeterre/DesignPatterns - > Real singleton)