无法从以编程方式创建的 UINavigationController 推送

Posted

技术标签:

【中文标题】无法从以编程方式创建的 UINavigationController 推送【英文标题】:Can't push from programmatically created UINavigationController 【发布时间】:2017-04-14 11:57:45 【问题描述】:

在使用 Xcode 8.3 和 ios 10.3 的 Swift 3 项目中,我得到了一个导航控制器来推送。该应用程序使用导航控制器运行,直到我尝试使用它来推送。一切正常,直到导致应用程序崩溃的最后一行,fatal error: unexpectedly found nil while unwrapping an Optional value。我不想使用storyboard,这个问题的重点是如何在没有storyboard的情况下完成这个任务。

应用代理代码

class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

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

        window = UIWindow(frame: UIScreen.main.bounds)

        window?.makeKeyAndVisible()

        window?.rootViewController = UINavigationController(rootViewController: MainViewController())


视图控制器:

import UIKit

class MainViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        view.backgroundColor = .white

        let navController = navigationController

        let myProfileViewController = MyProfileViewController()

        navController!.pushViewController(myProfileViewController, animated: true)

    
        

【问题讨论】:

【参考方案1】:

移动

let navController = navigationController
let myProfileViewController = MyProfileViewController()

navController!.pushViewController(myProfileViewController, animated: true)

viewDidLoadviewDidAppear

viewDidLoad 中没有设置父导航控制器,你不应该从那里开始动画。

【讨论】:

【参考方案2】:

您可以在情节提要中添加导航控制器, 在情节提要中单击 MainViewController 并从编辑器菜单中添加导航控制器并通过导航控制器推送如下代码。

  let vc = self.storyboard?.instantiateViewController(withIdentifier: "MyProfileViewController") as! MyProfileViewController
    self.navigationController?.pushViewController(vc, animated: true)

确保故事板标识符正确。 & 从 AppDelegate 类中删除导航控制器代码。

【讨论】:

我不想使用情节提要。我确实知道如何在情节提要中执行此操作,我想知道如何以编程方式执行此操作,但感谢您的回复。【参考方案3】:

首先像这样为您的导航控制器命名

然后在您的代码中像这样初始化它 let nav = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "yourNavigation") as! UINavigationController); nav.pushFrontViewController(MainViewController(), animated: true); window?.rootViewController = nav

【讨论】:

我的导航控制器是以编程方式创建的,故事板中没有任何内容。 以上就是全部了。重现错误应该足够了。 那么你面临的问题是你已经声明了你的 MainViewController 但 UINavigationController 没有被声明或初始化,很抱歉,我的专业知识有限 那我该怎么做呢?请写下您的回复作为答案。 有一个解决方案***.com/questions/28793331/…看看有没有帮助

以上是关于无法从以编程方式创建的 UINavigationController 推送的主要内容,如果未能解决你的问题,请参考以下文章

如何从以编程方式创建的 UITableView 中分离?

从以编程方式创建的tableViewCell中删除图像

如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?

Segue 和 Button 以编程方式快速

以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件

从 IB 加载视图