【问题标题】:Fatal error when trying to pass data to another view controller尝试将数据传递到另一个视图控制器时出现致命错误
【发布时间】:2020-04-13 15:17:48
【问题描述】:

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

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

get 请求有效,但是当点击按钮时,我得到一个 fatalError :“致命错误:在隐式展开可选值时意外发现 nil”。

我想补充一点,错误显示在“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.
    }


}```

【问题讨论】:

    标签: ios swift segue pass-data


    【解决方案1】:

    提示:尽量避免强制向下投射

    在您的情况下,您试图在 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
            }
        }
    }
    

    【讨论】:

    • 我不完全同意这个提示:尽量避免强制向下转换,如果这是设计错误,那么你将“隐藏”你的通过吓唬强迫的错误。
    • 我按照@maysam 的建议编辑了我的代码,并且在“准备转场”中不再出现错误。但是,我仍然无法将数据传递给第二个视图控制器。
    • 你没有得到传递的数据?怎么会?将 var labelValue: String? 替换为 var labelValue: String? { didSet { print("*value set*") } } 并查看它是否在控制台中打印任何内容。
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多