【问题标题】:Can't push from programmatically created UINavigationController无法从以编程方式创建的 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)

    }
}        

【问题讨论】:

    标签: swift3 uinavigationcontroller


    【解决方案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 没有被声明或初始化,很抱歉,我的专业知识有限
      • 那我该怎么做呢?请写下您的回复作为答案。
      • 有一个解决方案stackoverflow.com/questions/28793331/…看看有没有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多