当前位置: 首页 > 面试题库 >

Swift- 来自appDelegate的pushViewController,rootViewController.navigationController为零

单于钊
2023-03-14
问题内容

在遵循一些指南时遇到问题,特别是 http://blog.originate.com/blog/2014/04/22/deeplinking-in-
ios/

我正在设置url方案,并且可以很好地从另一个应用程序启动该应用程序,但是传入主机或url不能正常工作。我正在为所有视图布局使用情节提要和界面生成器。

指南在appDelegate中显示此openURL:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    if([[url host] isEqualToString:@"page"]){
        if([[url path] isEqualToString:@"/page1"]){
            [self.mainController pushViewController:[[Page1ViewController alloc] init] animated:YES];
        }
    return YES;
    }
}

这是我的版本经过简化并从其他一些来源迅速得到的信息,例如,
从AppDelegate获取ViewController的实例。在Swift中,我现在跳过url主机的条件,以消除问题中潜在的其他变量。

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
    var rootViewController = self.window!.rootViewController
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var profileViewController = mainStoryboard.instantiateViewControllerWithIdentifier("profile") as ProfileViewController

    rootViewController.navigationController.popToViewController(profileViewController, animated: true)

    return true

}

快速版本会导致崩溃: fatal error: unexpectedly found nil while unwrapping an Optional value

看来rootViewController还没有navigationController吗?


问题答案:

在我看来,rootViewController实际上实际上是UINavigationController类型,因此将其强制转换为声明允许我直接在其上调用pushToViewController。

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
    let rootViewController = self.window!.rootViewController as! UINavigationController
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let profileViewController = mainStoryboard.instantiateViewController(withIdentifier: "InstructionVC") as! InstructionVC
    rootViewController.pushViewController(profileViewController, animated: true)
    return true

}


 类似资料:
  • 问题内容: 当用户单击UILocalNotification时,我试图迅速从应用程序委托中加载特定的ViewController。我已经知道这是在此函数中调用的: 但是当我尝试访问一个打开的ViewController时,我认为它返回null,因为我的应用程序崩溃了。这是我正在尝试的: 在popToViewController行上崩溃了。 问题答案: 您可以尝试: 斯威夫特3:

  • 问题内容: 我刚刚下载了新的Xcode 7.0 beta,并完成了从Swift 1.2到Swift 2的迁移。迁移显然并没有改变整个代码,实际上,方法saveContext()很好,直到抛出2条错误为止: 二进制运算符“ &&”不能应用于两个布尔操作数 和 可以抛出呼叫,但未将其标记为“ try”,并且未处理错误 该方法如下所示: 关于如何使其运作的任何想法? 问题答案: 您提供的两个错误中的第一

  • 问题内容: 我该怎么做?从数组中获取前n个元素: 当前出现以下错误: 编辑: 这是我正在使用的功能。 问题答案: 这对我有用: 您的问题可能与如何声明数组开始有关。 编辑: 要修复您的功能,您必须将自己转换为数组:

  • 问题内容: 我正在尝试使用某些功能 但是从后台进入应用程序后,当该应用程序处于活动状态时,该功能似乎根本无法运行。 函数看起来像这样 并使用这个变量 我错过了什么? 谢谢! 问题答案: 将创建ViewController的新实例并调用此函数。然后,由于不使用视图控制器,它将被垃圾回收/从内存中删除。您需要在使用中的实际视图控制器上调用此方法。不是它的新实例。 最好的选择是监听iOS提供的通知。 确

  • 问题内容: 我的导航控制器会间歇性地在推送时冻结。似乎将新的视图控制器添加到堆栈中,但是动画从未发生。我还有另外两个在屏幕上保存视图控制器的容器,在导航控制器冻结后,我可以与它们进行交互。真正有趣的是,如果我尝试将另一个视图控制器推送到导航控制器的堆栈上,我会注意到堆栈顶部还有一个额外的视图控制器(我最初推送的视图控制器冻结了导航控制器)。因此,如果我在主屏幕上(我们将其称为VC- Home),并

  • 问题内容: 在我的SwiftUI项目中,我同时看到文件和文件。 它们之间有什么区别? 例如,在 并在 问题答案: 这两个文件旨在按整体运行应用程序所需的内容以及将支持在后台运行的一个“实例”所需的内容进行拆分。这将类似于一次配置数据库,但按窗口显示不同的值集。 您可以将它们视为全局和私有版本。一个是共享的,另一个则限于个人所有者。在某种程度上,它们正是您所期望的名称。 多窗口支持正在发生 下次创建