Ios Swift-appDelegate中的pushViewController,rootViewController.navigationController为零
在遵循一些指南时遇到问题,特别是 我正在设置url方案,从另一个应用程序启动该应用程序效果很好,但传入主机或url似乎并没有起到应有的作用。我在所有视图布局中使用故事板和界面生成器 本指南在appDelegate中显示此openURL: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
-(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.storyboard!.instantiateViewController(withIdentifier: "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获取导航控制器,而不是查看控制器。在您的情况下,上面的“一行代码”解决方案可能适合您