5

我正在开发一个应用程序,该应用程序在启动时检查有效的登录凭据,如果找到并且未过期,则显示主拆分视图控制器,如果没有,则应显示登录屏幕。

每个部分都可以单独工作,但我正在努力在启动时以最佳方式选择要显示的正确视图。

我尝试从根视图控制器设置模态segue,并在我的应用程序中设置:didFinishLaunchingWithOptions: App Delegate 中的函数,调用它:

// Segue to the login view controller...
if (loginNeeded) {
    [self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self];
}

这在逻辑上应该可行,但从应用程序委托中触发 segues 似乎是不可能的。

处理此问题的理想场所和技术是什么?

4

5 回答 5

4

您可以尝试自定义转场,根据这个帖子hidden-a-segue-on-login-process

或者,如果您迫切希望在拆分视图控制器加载之前显示登录信息,请尝试以下几行...

在主故事板上创建您的登录屏幕,例如,作为UIViewController. 确保它是初始场景(检查Is Initial View Controller)。

在情节提要上,从您的登录类创建一个新的 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
于 2012-05-27T11:54:24.790 回答
4

这就是我的做法。

在 didFinishLaunchingWithOptions 中:

//save the root view controller
[[self window] makeKeyAndVisible];
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
rootController = [[navigationController viewControllers] objectAtIndex:0];

应用程序委托中的其他地方:

[rootController performSegueWithIdentifier:@"fileSegueID" sender:self];

然后,在情节提要中,从分配为“rootController”的视图创建一个转场到所需的可选视图,并为该新转场指定 id fileSegueID。需要进行一些调试以确保将rootController变量分配给正确的视图。

于 2012-07-30T19:45:51.763 回答
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];
}
于 2012-12-11T18:05:14.740 回答
1

为什么不加载假设正确且未过期的登录凭据可见的屏幕(通过将其设置为窗口的根视图控制器),然后在第一个视图控制器的 viewDidLoad 中,检查是否有更新需要登录凭据。如果是这样,请进入登录视图控制器。

于 2012-05-10T18:40:04.047 回答
0

是的,如果您获得对 segue 的父视图控制器的引用,则可以使用它。你可以像这样得到它:

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self];

这仅在 viewControllers 数组中的索引与您的视图控制器之一匹配并且当然存在时才有效。在这种情况下是第一个(在数组和情节提要中)。

segue(“LoginScreen”)不得附加到操作。执行此操作的方法是通过控制从情节提要场景底部的文件所有者图标拖动到目标场景。将出现一个弹出窗口,要求在“Manual Segue”中选择一个选项;选择“推送”作为类型。点击小方块并确保您在属性检查器中。给它一个标识符,您将使用它在代码中引用它。

于 2014-04-01T22:43:20.570 回答