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

Amo*_*mos 14 iphone delegates objective-c storyboard ios5

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

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

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
Run Code Online (Sandbox Code Playgroud)

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

Amo*_*mos 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;
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*rry 10

您必须从应用程序委托遍历视图层次结构.假设AppDelegate持有对该引用的引用UITabBarController,您可以使用该viewControllers属性或selectedViewController属性来访问您的视图控制器.

  • 好的,没有办法从故事板创建应用程序委托的插座,所以我的陈述有点不正确.应用程序委托上有一个窗口属性,由storyboard自动设置,并具有rootViewController属性.这将是故事板中的第一个视图控制器.从那里你应该能够到达你需要的视图. (6认同)

小智 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];
}
Run Code Online (Sandbox Code Playgroud)

在任何ViewController中

- (void)viewDidLoad
{
    [super viewDidLoad];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    [appDelegate registerViewController:@"feelings" controller:self];
}
Run Code Online (Sandbox Code Playgroud)

在AppDelegate中

XViewController *vc = (XViewController *)[_viewControllers objectForKey:@"X"];
[X startSpinner];
Run Code Online (Sandbox Code Playgroud)

希望这有帮助

BS


inf*_*oop 7

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

UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
id viewcontroller = [mystoryboard instantiateViewControllerWithIdentifier:@"identifier"];
Run Code Online (Sandbox Code Playgroud)

这里的'标识符'是'Identity Inspector'中'Identity'部分中特定viewController的'storyBoard ID'中提供的名称.


Ste*_*rem 6

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