尝试将数据传递给另一个视图控制器时出现致命错误

Fatal error when trying to pass data to another view controller

为了练习我的网络,我构建了一个带有文本字段的应用程序,您可以在其中输入内容。我使用维基百科 API 来获取该术语/名称/表达式的定义。我的目标是将该定义显示到另一个视图控制器中。

一个按钮执行到新视图控制器的 segue,其中一个标签显示该定义。

get 请求有效,但是当点击按钮时,出现致命错误:"Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value"。

我想补充一点,错误显示在"prepare for segue"函数中。

这是我的第一个视图控制器的代码

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {

    @IBOutlet weak var textEntryLabel: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    //MARK: - Relevant variables
    let wikipediaURl = "https://en.wikipedia.org/w/api.php"
    var termDefinitionInfo: String = ""
    let segueName: String = "toDefinition"

    @IBAction func buttonToDefinition(_ sender: UIButton) {
        // on fait la requete ici
        httpCall(termDefinition: textEntryLabel.text ?? "nothing to pass")

        performSegue(withIdentifier: segueName , sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == segueName {
            let secondVC = segue.destination as! DefinitionViewController

            secondVC.definitionLabel.text = termDefinitionInfo

        }
    }

    //MARK: - NETWORKING

      func httpCall(termDefinition: String) {
          let parameters : [String:String] = [
                 "format" : "json",
                 "action" : "query",
                 "prop" : "extracts",
                 "exintro" : "",
                 "explaintext" : "",
                 "titles" : termDefinition,
                 "indexpageids" : "",
                 "redirects" : "1",
                 ]

          //
          request(wikipediaURl, method: .get, parameters: parameters).responseJSON { (response) in
              if response.result.isSuccess {
                //1. on affiche le tableau json initial
                let definitionJSON: JSON = JSON(response.result.value)
                print(definitionJSON)

                // deux valeurs : pageID et definition
                let pageId = definitionJSON["query"]["pageids"][0].stringValue
                let pageDefinition = definitionJSON["query"]["pages"][pageId]["extract"].stringValue
                self.termDefinitionInfo = pageDefinition
                print(self.termDefinitionInfo)

              } else {
                print("Error! Could not fetch data!")
            }
          }
      }


}

这是第二个视图控制器的代码

import SwiftyJSON
import Alamofire

class DefinitionViewController: UIViewController {

    @IBOutlet weak var definitionLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


}```

提示:尽量避免强制向下施法

在您的情况下,您试图在 IBOutlet 未连接到其父视图控制器时为其分配一个值。你最好这样做:

class DefinitionViewController: UIViewController {
    @IBOutlet weak var definitionLabel: UILabel!
    var labelValue: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        definitionLabel.text = labelValue
    }
}

在您的第一眼中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == segueName {
        if let secondVC = segue.destination as? DefinitionViewController {
          secondVC.labelValue = termDefinitionInfo
        }
    }
}