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