可以将performSegueWithIdentifier与AppDelegate一起使用吗?

时间:2012-05-10 18:17:40

标签: ios uisplitviewcontroller segue uistoryboard

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

每个部分都是单独工作正常,但我正在努力在发布时选择合适的视图进行显示。

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

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

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

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

5 个答案:

答案 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”)附加到操作。执行此操作的方法是通过控制 - 从故事板场景底部的文件所有者图标拖动到目标场景。将出现一个弹出窗口,询问“手动搜索”中的选项;选择“推”作为类型。点击小方块,确保您在属性检查器中。给它一个标识符,用于在代码中引用它。