我有一个视图控制器子类,SignInViewController
用于随时可能需要的登录。与其让我的应用程序中的每个视图控制器都监听需要登录的通知,不如让应用程序委托来做。
但是如何从我的应用程序委托中触发它?
我把它SignInViewController
放在我的主故事板中吗?如果是这样,我如何从我的应用程序委托访问我的故事板?还是其他方法更好?
我有一个视图控制器子类,SignInViewController
用于随时可能需要的登录。与其让我的应用程序中的每个视图控制器都监听需要登录的通知,不如让应用程序委托来做。
但是如何从我的应用程序委托中触发它?
我把它SignInViewController
放在我的主故事板中吗?如果是这样,我如何从我的应用程序委托访问我的故事板?还是其他方法更好?
您始终可以通过 UIApplication 单例引用您的应用程序委托。从那里你总是可以得到你的根视图控制器。使用您的根视图控制器,您可以获得对故事板的引用。
一旦你有了故事板,你所做的就是实例化你想要的视图控制器的一个实例。呈现它。
AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[currentVC presentModalViewController:lvc animated:YES];
可能有一种更直接的方法可以参考您的故事板,但这几乎总是会为您提供。
为了从任何地方(包括应用程序委托)显示视图控制器,我在 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。