使用App Delegate访问通过Storyboard创建的视图控制器

时间:2012-01-09 05:03:48

标签: iphone objective-c delegates ios5 storyboard

我正在使用storyboard开发iOS5应用程序,我在视图控制器类中有一个方法,我想从App Delegate访问。麻烦的是,这个视图控制器通过故事板中的标签栏控制器实例化,因此App Delegate无法直接调用我想要的方法......

要让视图控制器与App Delegate取得联系,所有人都必须使用:

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

是否有类似的简单方法指向已经实例化的视图控制器或类?

7 个答案:

答案 0 :(得分:15)

感谢Jerry(上图),这里的代码能让我得到我想要的东西:

    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
MasterViewController *result;

//check to see if navbar "get" worked
if (navigationController.viewControllers) 

    //look for the nav controller in tab bar views 
    for (UINavigationController *view in navigationController.viewControllers) {

        //when found, do the same thing to find the MasterViewController under the nav controller
        if ([view isKindOfClass:[UINavigationController class]])
            for (UIViewController *view2 in view.viewControllers) 
                if ([view2 isKindOfClass:[MasterViewController class]])                    
                    result = (MasterViewController *) view2;
}

答案 1 :(得分:10)

您必须从应用委托中遍历视图层次结构。假设AppDelegate包含对UITabBarController的引用,您可以使用viewControllers属性或selectedViewController属性访问您的视图控制器。

答案 2 :(得分:10)

我可能会反过来做。在AppDelegate中调用registerViewController或其他东西创建一个方法。在每个ViewController中,使用名称调用方法。然后在AppDelegate中,您可以随后执行任何操作。做各种练习很麻烦

在AppDelegate中

- (void)registerViewController:(NSString *)name controller:(UIViewController *)controller
{
    if(_viewControllers == nil)
    {
        _viewControllers = [[NSMutableDictionary alloc] init];

    }

    [_viewControllers setObject:controller forKey:name];
}

在任何ViewController中

- (void)viewDidLoad
{
    [super viewDidLoad];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    [appDelegate registerViewController:@"feelings" controller:self];
}

在AppDelegate中

XViewController *vc = (XViewController *)[_viewControllers objectForKey:@"X"];
[X startSpinner];

希望这个帮助

BS

答案 3 :(得分:7)

如果您正在使用故事板,并且想要在故事板中使用viewController的实例,则可以使用以下

UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
id viewcontroller = [mystoryboard instantiateViewControllerWithIdentifier:@"identifier"];

这里的'标识符'是特定viewController' storyBoard ID'中提供的名称。在'身份' “身份检查员”中的部分'。

答案 4 :(得分:6)

我有更好的解决方案。您可以使用window.rootViewController.storyboard来获取对该视图的故事板的引用。

答案 5 :(得分:2)

在AppDelegate中,您只需使用索引通过UITabBarController访问控制器:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
firstViewController = [[tabBarController viewControllers] objectAtIndex:0];
secondViewController = [[tabBarController viewControllers] objectAtIndex:1];
thirdViewController = [[tabBarController viewControllers] objectAtIndex:2];

当然,如果更改标签栏的顺序,这将会搞砸。此外,如果您正在寻找层次结构中更深层次的控制器,则需要做更多的工作。

答案 6 :(得分:1)

<强>夫特

这是@ infiniteLoop答案的Swift版本。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myViewController = storyboard.instantiateViewControllerWithIdentifier("identifier") as! MyViewController

您需要使用项目中使用的任何内容替换故事板名称,查看控制器名称和查看控制器标识符。

相关任务