ios - 尝试将数据传递到另一个视图控制器时出现致命错误
问题描述
为了练习我的网络,我构建了一个带有文本字段的应用程序,您可以在其中输入一些内容。我使用维基百科 API 来获取该术语/名称/表达式的定义。我的目标是将该定义显示到另一个视图控制器中。
一个按钮执行到新视图控制器的 segue,其中一个标签显示该定义。
获取请求有效,但是当点击按钮时,我得到一个 fatalError :“致命错误:在隐式展开可选值时意外发现 nil”。
我想补充一点,错误显示在“准备转场”功能中。
这是我的第一个视图控制器的代码
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
}
}
}
推荐阅读
- python - 如何使用具有大量行的 DataFrame 使线图可读
- python - 使用管道避免 X 和 y 的数据泄漏
- python - 用 Python 制作一个 Triacontagon
- ruby-on-rails - 为设计确认电子邮件设置电子邮件消息 ID
- angularjs - 如何为降级的 Angular 6 应用程序设置路由到 AngularJS 应用程序?
- javascript - 在跨度选项卡之间切换以显示不同的 Iframe HTML 错误
- java - 在 Java 中使用 ASM 测试跳转
- css - 滑动移动导航溢出
- docker - 为什么 Neo4J docker 身份验证不起作用
- raku - 使用冒号语法的错误方法调用。没有错误。但是这是什么意思?