为什么我的变量值在 Swift 中恢复?
Why does the value of my variable revert in Swift?
我的代码可以正常工作,但我不知道它为什么有效。
这个 prepareForSegue 函数不起作用,当我的变量在 prepareForSegue 进入的 viewController 中被调用时,它 returns nil。
原VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
let destinationVC = LatinViewController()
destinationVC.latinText = latinText
}
}
}
目的地VC:
var latinText: String?
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() {
let latinTranslator = LatinTranslator()
let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: **latinText!**)
textLabel.text = latinDefinition
}
拉丁文!在这里强制展开时没有值,即使我在 prepare for segue 函数中设置了它的值。
现在,此代码有效。我有点知道静态变量是如何工作的,所以我真的很困惑为什么前面的代码不起作用——它抛出一个 nil value not found 错误。
原文VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
LatinViewController.latinText = latinText
}
}
}
目的地VC:
static var latinText: String!
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let latinTranslator = LatinTranslator()
let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: LatinViewController.latinText)
textLabel.text = latinDefinition
}
按下按钮时调用 segue。我检查过,只有一个segue。请帮忙!
您遇到的问题是您正在创建 LatinViewController
的新实例,而不是使用您的应用实际导航到的实例。
而不是这个:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
let destinationVC = LatinViewController()
destinationVC.latinText = latinText
}
}
}
你应该这样做:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == K.latinSegue, let destination = segue.destination as? LatinViewController else {
return
}
guard let text = latinTextField.text, !text.isEmpty else {
return
}
destination.latinText = text
}
它 return nil 因为你创建新的 LatinViewController 的 destinationVC 而不是你当前 segue
的 viewController
let destinationVC = LatinViewController()
改为:
let destinationVC = segue.destination as? LatinViewController
我的代码可以正常工作,但我不知道它为什么有效。
这个 prepareForSegue 函数不起作用,当我的变量在 prepareForSegue 进入的 viewController 中被调用时,它 returns nil。
原VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
let destinationVC = LatinViewController()
destinationVC.latinText = latinText
}
}
}
目的地VC:
var latinText: String?
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() {
let latinTranslator = LatinTranslator()
let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: **latinText!**)
textLabel.text = latinDefinition
}
拉丁文!在这里强制展开时没有值,即使我在 prepare for segue 函数中设置了它的值。
现在,此代码有效。我有点知道静态变量是如何工作的,所以我真的很困惑为什么前面的代码不起作用——它抛出一个 nil value not found 错误。
原文VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
LatinViewController.latinText = latinText
}
}
}
目的地VC:
static var latinText: String!
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let latinTranslator = LatinTranslator()
let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: LatinViewController.latinText)
textLabel.text = latinDefinition
}
按下按钮时调用 segue。我检查过,只有一个segue。请帮忙!
您遇到的问题是您正在创建 LatinViewController
的新实例,而不是使用您的应用实际导航到的实例。
而不是这个:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.latinSegue {
if latinTextField.text != nil && latinTextField.text != "" {
guard let latinText = latinTextField.text else { fatalError("latinText broken")}
let destinationVC = LatinViewController()
destinationVC.latinText = latinText
}
}
}
你应该这样做:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == K.latinSegue, let destination = segue.destination as? LatinViewController else {
return
}
guard let text = latinTextField.text, !text.isEmpty else {
return
}
destination.latinText = text
}
它 return nil 因为你创建新的 LatinViewController 的 destinationVC 而不是你当前 segue
的 viewControllerlet destinationVC = LatinViewController()
改为:
let destinationVC = segue.destination as? LatinViewController