从应用程序委托中呈现故事板视图控制器?
Posted
技术标签:
【中文标题】从应用程序委托中呈现故事板视图控制器?【英文标题】:Present storyboard view controller from app delegate? 【发布时间】:2012-04-19 18:24:08 【问题描述】:我有一个视图控制器子类SignInViewController
,用于随时可能需要的登录。与其让我的应用程序中的每个视图控制器都监听需要登录的通知,不如让应用程序委托来做。
但是如何从我的应用委托中触发它?
我是否将SignInViewController
放在我的主情节提要中?如果是这样,我如何从我的应用程序委托访问我的故事板?还是有其他更好的方法?
【问题讨论】:
【参考方案1】:您始终可以通过 UIApplication 单例引用您的应用委托。 从那里你总是可以得到你的根视图控制器。 使用您的根视图控制器,您可以获得对故事板的引用。
一旦你有了故事板,你要做的就是实例化你想要的视图控制器的一个实例。 呈现它。
AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[currentVC presentModalViewController:lvc animated:YES];
可能有一种更直接的方式来获取对故事板的引用,但这几乎总能帮到你。
【讨论】:
这意味着引用您当前正在使用的视图控制器,通过使用关键字“self”代替“currentVC”来完成。 但他询问了从 appDelegate “在”进入我打赌的任何视图控制器之前呈现的情况 不,我没有。知道我需要登录并不是我可以在 ios 看门狗允许我设置 UI 的短时间内做出的决定。更大的问题是来自任何视图控制器。 这个答案的问题是这会实例化一个新的视图控制器,它不会为您提供可能已经被情节提要实例化的视图控制器。【参考方案2】:为了从任何地方(包括应用程序委托)显示视图控制器,我在 iOS 8+ 中成功使用了这段代码(我不确定早期的兼容性)。如果有,它将从模态视图中显示。
YOURAppDelegate *appDelegate = (YOURAppDelegate *)[[UIApplication sharedApplication] delegate];
UINavigationController *rootNavC = (UINavigationController *)appDelegate.window.rootViewController;
UIViewController *topVC = rootNavC.topViewController;
UIViewController *myNewVC = [rootNavC.storyboard instantiateViewControllerWithIdentifier:<YOUR STORYBOARD ID>];
if (topVC.presentedViewController)
if ([topVC.presentedViewController class] == [UINavigationController class])
dispatch_async(dispatch_get_main_queue(), ^
[((UINavigationController*)topVC.presentedViewController) pushViewController:myNewVC
animated:YES];
);
else
dispatch_async(dispatch_get_main_queue(), ^
[topVC.presentedViewController.navigationController pushViewController:myNewVC
animated:animated];
);
else
dispatch_async(dispatch_get_main_queue(), ^
[rootNavC pushViewController:myNewVC
animated:animated];
);
我通常将它包装在一个方便的方法中并传入我的实例化视图控制器。对于 OP - 您将在情节提要中创建 SignInViewController,为其分配一个唯一的情节提要 ID,然后在上述代码中替换该 ID。
【讨论】:
以上是关于从应用程序委托中呈现故事板视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
从 UIScrollView 子视图呈现故事板 UIViewController