如何在 appdelegate 中控制视图控制器?

Posted

技术标签:

【中文标题】如何在 appdelegate 中控制视图控制器?【英文标题】:How to control view controllers in appdelegate? 【发布时间】:2016-01-05 07:47:29 【问题描述】:

我真的为这个简单的问题设计了结构。

我只是使用以下代码从一个视图控制器移动到另一个视图控制器。

homescreen *home;
home=[self.storyboard instantiateViewControllerWithIdentifier:@"home"];
[self presentViewController:home animated:YES completion:nil];

AppDelegate 方法中尝试使用相同的代码。

UIStoryboard *storyboard;
sur= [storyboard instantiateViewControllerWithIdentifier:@"survey"];
[self.window.rootViewController presentViewController:sur animated:YES completion:nil];

当我使用这段代码时,我遇到了这个崩溃:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模式视图控制器

我不想让它成为根视图控制器,我只需要移动它。

【问题讨论】:

【参考方案1】:

你只声明了 UIStoryboard *storyboard 没有初始化它,并且在下一行你调用方法 instantiateViewControllerWithIdentifier 在 nil 对象上。最终storyboard 变量在下一行替换了 nil 并崩溃。

sur= [storyboard instantiateViewControllerWithIdentifier:@"survey"];

【讨论】:

【参考方案2】:

您不能直接在空的 window.rootViewController 上呈现视图。您需要先将其设置为任何 viewController,然后显示需要显示的 viewController。参考这段代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    InitialViewController *initialVC = [storyboard instantiateViewControllerWithIdentifier:@"InitialViewController"];
    self.window.rootViewController = initialVC;
    [self.window makeKeyAndVisible];

    ShowThisViewController *showThisVC = [storyboard instantiateViewControllerWithIdentifier:@"ShowThisViewController"];
    [self.window.rootViewController presentViewController:showThisVC animated:YES completion:nil];

    return YES; 

【讨论】:

【参考方案3】:

访问this。

我认为阿米尔是对的。但是,此外,您需要使您的窗口可见。

你需要打电话

[self.window makeKeyAndVisible];

在展示任何 ViewController 之前。

【讨论】:

【参考方案4】:

使用此代码

    DEMORootViewController *VerifyV = [self.storyboard  instantiateViewControllerWithIdentifier:@"Identifier"];  

   UINavigationController *navigationController=[[UINavigationController alloc]initWithRootViewController:VerifyV];

    self.window.rootViewController = navigationController;

【讨论】:

【参考方案5】:

只需尝试以下代码:

UIStoryboard *storyboard;
survey *sur= [storyboard instantiateViewControllerWithIdentifier:@"survey"];
UIViewController *curViewCont = [UIApplication sharedApplication].keyWindow.rootViewController;
while (curViewCont.presentedViewController) 
    curViewCont = curViewCont.presentedViewController;

[curViewCont presentViewController:sur animated:YES completion:nil];

希望它对你有用。

【讨论】:

@KishoreKumar 你还在让应用崩溃吗? @KishoreKumar 它没有给我错误。我能够运行我的代码。你有没有用你的视图控制器名称代替调查? @KishoreKumar 已经在我的源代码中测试了这个解决方案,我使用的是相同的,它对我很有用

以上是关于如何在 appdelegate 中控制视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从 appdelegate xcode 11 swift 5 呈现视图控制器

目标 C:如何从 appdelegate 呈现模态视图控制器?

如何从 Appdelegate 导航到另一个视图控制器

如何在 appdelegate 中关闭视图控制器?

如何将数据从 appdelegate 传递到视图控制器?