【问题标题】:When trying to segue to a view controller from a table view i get this error: Unexpectedly found nil while unwrapping当试图从表视图中转到视图控制器时,我收到此错误:Unexpectedly found nil while unwrapping
【发布时间】:2020-01-05 03:09:29
【问题描述】:

我有一个名为“hydrogenSegue”的segue,从“hydrogenBoxButton”到“Hydrogen”视图控制器。但是,我还想实现一个表格视图,以便我可以搜索一个元素。我尝试编写代码,因此当单击单元格时,它将转到元素的视图。我在这里以氢气为例。

在我的主 ViewController.swift 文件中,我有这个来传输数据:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    //If identifier equals the hydrogen element go to the elements Swift file

    if segue.identifier == "hydrogenSegue" {

        let hydrogenAtomicNumberPassing = segue.destination as! hydrogenViewController
        hydrogenAtomicNumberPassing.hydrogenAtomicNumberPassed = hydrogenAtomicNumber

        let hydrogenAtomicMassPassing = segue.destination as! hydrogenViewController
        hydrogenAtomicMassPassing.hydrogenAtomicMassPassed = hydrogenAtomicMass


    }
}

在 hydroViewController.swift 文件中我有这个:

import UIKit

class hydrogenViewController: UIViewController {

var hydrogenAtomicNumberPassed: Int!
var hydrogenAtomicMassPassed: Float!

@IBOutlet weak var hydrogenInformationLabel: UILabel!
@IBOutlet weak var hydrogenAtomicNumberLabel: UILabel!
@IBOutlet weak var hydrogenAtomicMassLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    //Setting the background color
    self.view.backgroundColor = UIColor.gray

    //Converting hydrogen's atomic number from an Int to a String
    let hydrogenAtomicNumberString = String("\(hydrogenAtomicNumberPassed!)")
    hydrogenAtomicNumberLabel.text = "Atomic Number: \(hydrogenAtomicNumberString)"

    //Converting hydrogen's atomic mass from a Float to a String
    let hydrogenAtomicMassString = String("\(hydrogenAtomicMassPassed!)")
    hydrogenAtomicMassLabel.text = "Atomic Mass: \(hydrogenAtomicMassString)"

}

}

我在以下位置收到错误:

let hydrogenAtomicNumberString = String("\(hydrogenAtomicNumberPassed!)")

如果我只修复那条线,我假设它也会发生在这条线上:

let hydrogenAtomicMassString = String("\(hydrogenAtomicMassPassed!)")

我的“searchViewController”(用于表格视图的 .swift 文件)中有这段代码:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         print("row selected : \(indexPath.row)")

         if indexPath.row == 0 {

             let hydrogenSearchSegue = UIStoryboard(name:"Main", 
                bundle:nil).instantiateViewController(withIdentifier: "hydrogenView") as! 
                hydrogenViewController

             self.navigationController?.pushViewController(hydrogenSearchSegue, 
             animated:true)
     }

}

当我点击表格视图中的“Hydrogen”单元格时,它会崩溃到这个错误:

Hydrogen cell

The crash

当我点击这张图片中的“H”按钮时,它会将我带到氢视图控制器:

Image of the Hydrogen Button in the simulator (Top Left)

Image of the Hydrogen View Controller

我希望氢电池像按钮一样切换到氢视图控制器。

当早先出现同样的问题时,我只是在故事板中遇到了 segue 名称的问题。但是,由于表格视图中没有可见的 segue,我不知道如何解决这个问题。

我试过了:

        performSegue(withIdentifier: "hydrogenSegue", sender: nil)

我在想我可以将按钮中的“hydrogenSegue”重用到视图控制器,但我得到了一个 SIGABRT 错误。它只是说没有名称为“hydrogenSegue”的segue。如果我能以某种方式重用该转场,那将是最好的,因为一切都已经连接,但我现在发现“searchViewController”无法识别转场。感谢您提供任何帮助,我的主要目标是让单击的单元格移动到元素的指定视图。我试图提供尽可能多的信息,但不会太长,如果需要更多信息,我应该能够提供。

【问题讨论】:

    标签: ios swift segue optional forced-unwrapping


    【解决方案1】:

    好吧。第一个答案

    在您的 HydroViewController 中尝试使用此行。

    var hydrogenAtomicNumberPassed: Int?
    var hydrogenAtomicMassPassed: Float?
    
    override func viewDidLoad(){
       super.viewDidLoad()
       self.viewBackgroundColor = .gray
    }
    
    override func viewWillAppear(){
       super.viewWillAppear()
       if let number = hydrogenAtomicNumberPassed
       {
           hydrogenAtomicNumberLabel.text = "Atomic Number: \(number)"
       }
       if let mass = hydrogenAtomicMassPassed
       {
           hydrogenAtomicMassLabel.text = "Atomic Mass: \(mass)"
       }
    }
    

    现在,segues 只在几个 viewController 之间“存在”,如果你有第三个 view controller,最后一个不会识别他。

    另外,您正在使用 segues 和导航控制器,从我的角度来看,将两者混合使用是个坏主意,我的意思是,有些特定的应用程序可以使用这两种方式来呈现视图,这只是一个建议。

    如果您想使用 pushviewcontroller 传递数据,请仅使用此行

    if indexPath.row == 0 {
         let hydrogenSearchSegue = UIStoryboard(name:"Main",bundle:nil).instantiateViewController(withIdentifier: "hydrogenView") as! hydrogenViewController
         hydrogenSearchSegue.VAR_hydrogenViewController = YOURVAR_INYOURFILE
         self.navigationController?.pushViewController(hydrogenSearchSegue, animated:true)
    }
    

    如果您有任何疑问,请告诉我,我会尽力帮助您。

    【讨论】:

    • 不幸的是,你给我的原子质量和原子序数标签代码给了我一些错误。我决定将它添加到 viewDidLoad() 中,但在模拟器中显示时它会给我一个类似“可选”([Hydrogen's atomic number])的结果。我也对您所说的“VAR_hydrogenViewController”和“YOURVAR_INYOURFILE”的意思感到困惑,我要添加什么样的变量?
    • 也许有一些方法可以安全地解开这些值而不是强制它?
    • 我为可选项编辑了我的答案,本文解释了如何在 viewControllers 之间传递数据,How To: Pass Data Between View Controllers 请阅读第一篇(使用属性在视图控制器之间传递数据 (A → B))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多