我正在开发一个应用程序,在启动时检查有效的登录凭据,如果找到并且未过期,则会显示主拆分视图控制器,如果不是,则应显示登录屏幕。
每个部分都是单独工作正常,但我正在努力在发布时选择合适的视图进行显示。
我尝试过根视图控制器设置一个模态segue,在我的应用程序中:在App Delegate中设置didFinishLaunchingWithOptions:函数,调用它:
// Segue to the login view controller...
if (loginNeeded) {
[self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self];
}
这在逻辑上应该可行,但是从app委托中触发segue似乎是不可能的。
处理此问题的理想场所和技术是什么?
答案 0 :(得分:4)
您可以根据此帖hiding-a-segue-on-login-process尝试自定义segue。
或者,如果您在分割视图控制器加载之前迫切需要登录显示,请尝试以下几行...
在主故事板上创建登录屏幕,例如UIViewController
的子类。确保它是初始场景(检查是初始视图控制器)。
在故事板上,从登录类创建一个新的segue到原始的SplitViewController。为其指定一个标识符“Load SplitViewController
”和一个segue自定义类名称,我们将其称为FullyReplaceSegue
。
在登录类.m文件中,添加用户登录后要调用的代码:
[self performSegueWithIdentifier:@"Load SplitViewController" sender:self];
根据UIStoryboardSegue
创建新的segue类,并将其命名为FullyReplaceSegue
。
.h文件
#import <UIKit/UIKit.h>
@interface : UIStoryboardSegue
@end
.m文件
#import "FullyReplaceSegue.h"
@implementation FullyReplaceSegue
- (void)perform
{
UIViewController *dest = (UIViewController *) super.destinationViewController;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
window.rootViewController = dest;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UISplitViewController *splitViewController = (UISplitViewController *)dest; // assumes we're transitioning to a UISplitViewController!
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;
}
}
@end
答案 1 :(得分:4)
我是这样做的。
在didFinishLaunchingWithOptions中:
//save the root view controller
[[self window] makeKeyAndVisible];
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
rootController = [[navigationController viewControllers] objectAtIndex:0];
app delegate中的其他地方:
[rootController performSegueWithIdentifier:@"fileSegueID" sender:self];
然后,在故事板中,从视图中创建一个被指定为“rootController”的segue到期望的可选视图,并为该新segue提供id fileSegueID
。需要进行一些调试以确保将rootController
变量分配给正确的视图。
答案 2 :(得分:2)
也许有点晚了,但我一直在寻找相同的建议。这就是我最后做的事情。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Signup" bundle:nil];
if(isLoggedIn) {
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
IndexController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"IndexController"];
[navigationController pushViewController:ivc animated:NO];
}
答案 3 :(得分:1)
为什么不加载可见的屏幕,假设正确且未过期的登录凭据(通过将其设置为窗口的根视图控制器),然后在第一个视图控制器的viewDidLoad中,检查如果需要更新登录凭据。如果是这样,请进入登录视图控制器。
答案 4 :(得分:0)
是的,如果您获得对segue的父视图控制器的引用,则可以使用它。你可以这样得到它:
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self];
这仅在viewControllers数组中的索引与视图控制器中的索引匹配且当然存在时才有效。在这种情况下是第一个(在数组和故事板中)。
不得将segue(“LoginScreen”)附加到操作。执行此操作的方法是通过控制 - 从故事板场景底部的文件所有者图标拖动到目标场景。将出现一个弹出窗口,询问“手动搜索”中的选项;选择“推”作为类型。点击小方块,确保您在属性检查器中。给它一个标识符,用于在代码中引用它。