Swift - 来自appDelegate的pushViewController,rootViewController.navigationController是nil

teh*_*afe 22 uiviewcontroller uinavigationcontroller ios appdelegate swift

按照一些指南遇到问题,特别是 http://blog.originate.com/blog/2014/04/22/delinklinking-in-ios/

我正在设置网址方案,它可以很好地从另一个应用程序启动应用程序,但传入主机或网址似乎不应该正常工作.我正在为所有视图布局使用故事板和界面构建器.

该指南在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的版本简化,并从其他一些来源迅速,即 获取ViewController的实例从AppDelegate在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

}
Run Code Online (Sandbox Code Playgroud)

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

似乎rootViewController还没有navigationController呢?

Kum*_* KL 26

SWIFT 4: 使用条件绑定和链接推送的安全方式

if let navController = self.navigationController, let viewController = self.storyboard?.instantiateViewController(withIdentifier: "indentfier") as? CustomViewController{
    navController.pushViewController(viewController, animated: true)
}
Run Code Online (Sandbox Code Playgroud)

在一行代码中:

斯威夫特3:

self.navigationController!.pushViewController(self.storyboar??d!.instantiateViewCo??ntroller(withIdentif??ier: "view2") as UIViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)
self.navigationController!.pushViewController(self.storyboard!.instantiateViewControllerWithIdentifier("view2") as UIViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)

  • Swift 2.0 `self.navigationController!.pushViewController(self.storyboard?.instantiateViewControllerWithIdentifier("view2") as! UIViewController,animated: true)` (4认同)

teh*_*afe 25

在我的情况下,似乎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

}
Run Code Online (Sandbox Code Playgroud)


A.G*_*A.G 8

APPDELEGATE TO PAGE:

        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let loginPageView = mainStoryboard.instantiateViewControllerWithIdentifier("leadBidderPagerID") as! LeadBidderPage
        var rootViewController = self.window!.rootViewController as! UINavigationController
        rootViewController.pushViewController(loginPageView, animated: true)
Run Code Online (Sandbox Code Playgroud)

PAGE到PAGE:

        let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("scoutPageID") as! ScoutPage
        self.navigationController?.pushViewController(loginPageView, animated: true)
Run Code Online (Sandbox Code Playgroud)