Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-appDelegate中的pushViewController,rootViewController.navigationController为零_Ios_Swift_Uiviewcontroller_Uinavigationcontroller_Appdelegate - Fatal编程技术网

Ios Swift-appDelegate中的pushViewController,rootViewController.navigationController为零

Ios Swift-appDelegate中的pushViewController,rootViewController.navigationController为零,ios,swift,uiviewcontroller,uinavigationcontroller,appdelegate,Ios,Swift,Uiviewcontroller,Uinavigationcontroller,Appdelegate,在遵循一些指南时遇到问题,特别是 我正在设置url方案,从另一个应用程序启动该应用程序效果很好,但传入主机或url似乎并没有起到应有的作用。我在所有视图布局中使用故事板和界面生成器 本指南在appDelegate中显示此openURL: -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(i

在遵循一些指南时遇到问题,特别是

我正在设置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;
    }
}
if let rootViewController = self.window!.rootViewController as? UINavigationController {
   let storyboard = UIStoryboard(name: "Main", bundle: nil)

   if let viewcontroller = storyboard.instantiateViewController(withIdentifier: "DiscussionBoardSID") as? DiscussionBoardViewController {
      viewcontroller.postID = "13" ///pass data to your viewcontroller
      rootViewController.pushViewController(viewcontroller, animated: true)
   }
}
这是我的简化版本,用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

}
swift版本会导致崩溃:
致命错误:在展开可选值时意外发现nil


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

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

在一行代码中:

Swift 3:

self.navigationController!.pushViewController(self.storyboar‌​d!.instantiateViewCo‌​ntroller(withIdentif‌​ier: "view2") as UIViewController, animated: true)

APPDELEGATE到页面:

        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)
        let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("scoutPageID") as! ScoutPage
        self.navigationController?.pushViewController(loginPageView, animated: true)
逐页:

        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)
        let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("scoutPageID") as! ScoutPage
        self.navigationController?.pushViewController(loginPageView, animated: true)
更新为swift 3/4。 投票最多的“一行代码”不起作用,因为“self”中没有导航控制器


Swift 3&4从AppDelegate推送viewcontroller的最佳实践:

-(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;
    }
}
if let rootViewController = self.window!.rootViewController as? UINavigationController {
   let storyboard = UIStoryboard(name: "Main", bundle: nil)

   if let viewcontroller = storyboard.instantiateViewController(withIdentifier: "DiscussionBoardSID") as? DiscussionBoardViewController {
      viewcontroller.postID = "13" ///pass data to your viewcontroller
      rootViewController.pushViewController(viewcontroller, animated: true)
   }
}

如果要使用NavigationBar显示和关闭或关闭(动画:true,完成:nil) 使用选项设置addObserver indidFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {



NotificationCenter.default.addObserver(self, selector: #selector(devolucionNoPresencial), name: NSNotification.Name(rawValue: "DevolucionNoPresencial"), object: nil)
        return true
}
那么你的方法呢

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
//do your code for .active, .inactive .background, etc

 if let userInfo = response.notification.request.content.userInfo as? [String : AnyObject] {
            if UIApplication.shared.applicationState == .active {
//activate the notificationCenter so you can call your @objc method
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DevolucionNoPresencial"), object: nil)
}
添加@objc方法

@objc private func devolucionNoPresencial() {


       //change DevolucionVC for VC you want to present

        if let controller = DevolucionVC() as? DevolucionVC {
            if let window = self.window, let rootViewController = window.rootViewController {
                var currentController = rootViewController
                while let presentedController = currentController.presentedViewController {
                    currentController = presentedController
                }
                currentController.present(controller, animated: true, completion: nil)
            }
        }

    }

}

Swift 2.0
self.navigationController!。pushViewController(self.storyboard?.instanceeviewcontrollerwhiteIdentifier(“view2”)为!UIViewController,动画:true)
Swift 3.0 self.navigationController!。pushViewController(self.storyboard!。实例化eViewController(标识符为:“view2”)作为UIViewController,动画:true)self.navigationController为零。如何推送?@Umitk PushViewController是导航API的一部分。因此,如果没有“UINavigationController”,您可以继续按任何键。更新了处理推送的最安全方法的答案我知道这已经进行了一年,但我想知道,如果推送到实例化的新视图控制器,这是否算作一个可以准备的步骤?谢谢。在遵循一些指南,只是从故事板抓取导航控制器,它只是不起作用,这就是诀窍!这是我在几个小时内看到的唯一有用的帖子。谢谢我一直在找一页一页地找。我在你们家找不到窗户solutin@RishabhDugar您是否在AppDelegate类中?不,我在控制器文件中解决方案是从AppDelegate获取导航控制器,而不是查看控制器。在您的情况下,上面的“一行代码”解决方案可能适合您