如何在 AppDelegate 中执行 Segue?

Posted

技术标签:

【中文标题】如何在 AppDelegate 中执行 Segue?【英文标题】:How to perform Segue in AppDelegate? 【发布时间】:2012-08-31 14:25:51 【问题描述】:

我正在尝试使用 Storyboard 在 ios 5.1 上完成应用程序。基本上我正在做一个保管箱应用程序。因为我使用的是 Dropbox SDK,所以到 Dropbox 的链接是在 AppDelegate.m 中处理的。用户可以选择从会话中取消链接并在不同的视图控制器中再次链接。所以每次用户链接和未链接的应用程序都必须将视图从 Appdelegate 切换到未连接到 rootviewcontroller 的视图控制器

在原始 Dropbox 的示例中,Dropbox 处理转换如下代码

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
    if ([[DBSession sharedSession] handleOpenURL:url]) 
        if ([[DBSession sharedSession] isLinked]) 
            [navigationController pushViewController:rootViewController.photoViewController animated:YES];
        
        return YES;
    

    return NO;

但是我正在使用带有导航控制器的 Storyboard,并且以下任何方法都不起作用我将方法放入 cmets。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
    if ([[DBSession sharedSession] handleOpenURL:url]) 
        if ([[DBSession sharedSession] isLinked]) 

            NSLog(@"App linked successfully!");
            // At this point you can start making API calls

            /*UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"MeetingViewController"];
            [self.navigationController pushViewController:viewController animated:YES]; */

           //[self performSegueWithIdentifier:@"xxxx" sender:self];

           /* LoginDropboxViewController *loginController=[[LoginDropboxViewController alloc] initWithNibName:@"LoginDropbox" bundle:nil];
            [navigationController pushViewController:loginController animated:YES]; */

        
        return YES;
    
    // Add whatever other url handling code your app requires here
    return NO;

这是应用程序的情节提要

那么如何在 AppDelegate.h 中切换视图?

注意:如果我添加一个 segue 并将 segue 命名为 goToMeeting [self performSegueWithIdentifier:@"goToMeeting" sender:self];

我得到的错误是:No Visible @interface for 'AppDelegate' declares the selector performSegueWithIdentifier:sender

【问题讨论】:

【参考方案1】:

如果您考虑手动推送视图而不是 segueperform 以下代码很可能会为您工作

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
    if ([[DBSession sharedSession] handleOpenURL:url]) 
        if ([[DBSession sharedSession] isLinked]) 

            NSLog(@"App linked successfully!");
            // At this point you can start making API calls

            //push view manually 
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
            LoginDropboxViewController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"LoginDropbox"];
            [(UINavigationController*)self.window.rootViewController pushViewController:ivc animated:NO];



    
        return YES;
    
    // Add whatever other url handling code your app requires here
    return NO;

【讨论】:

【参考方案2】:

你可以这样做:

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

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

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

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

【讨论】:

但是如果我需要将参数数据传递给 performSegueWithIdentifier 调用,我该怎么办。在应用程序委托中没有 ViewController,所以我无法覆盖 prepareForSegue() 调用?【参考方案3】:

在我的情况下,我需要使用 segue 从 appdelegate 转到仪表板屏幕,目标 c 中的代码如下。

if([rememberMe isEqualToString:@"YES"])
        //Goto Dashboard
        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        SWRevealViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"revealVc"];
        self.window.rootViewController = vc;
        [self.window.rootViewController performSegueWithIdentifier:@"sw_front" sender:self];
        [self.window makeKeyAndVisible];
    else
        //Goto login
        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        LoginViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
        self.window.rootViewController = vc;
        [self.window makeKeyAndVisible];
    

写在你的didFinishLaunchingWithOptions里面

希望对某人有所帮助。

【讨论】:

以上是关于如何在 AppDelegate 中执行 Segue?的主要内容,如果未能解决你的问题,请参考以下文章

AppDelegate segue 替代传递数据

从未打开的 ViewController 执行 Segue

如何从 appdelegate 呈现和关闭模态视图?

如何从 SKScene 中执行 segue?

iOS应用程序没有互联网连接时如何禁用segue?

如何延迟执行 Segue