为啥我的变量值在 Swift 中恢复?

Posted

技术标签:

【中文标题】为啥我的变量值在 Swift 中恢复?【英文标题】:Why does the value of my variable revert in Swift?为什么我的变量值在 Swift 中恢复? 【发布时间】:2020-09-04 02:21:52 【问题描述】:

我的代码工作正常,但我不知道它为什么工作。

有这个 prepareForSegue 函数不起作用,当我的变量在 prepareForSegue 所在的 viewController 中被调用时,它返回 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

拉丁文!在这里强制解包时没有值,即使我在准备转场函数中设置了它的值。

现在,此代码有效。我有点知道静态变量是如何工作的,所以我真的很困惑为什么前面的代码不起作用——它会抛出一个 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。请帮忙!

【问题讨论】:

使用 if let destinationVC = segue.destination as? LatinViewController ... 而不是创建一个新的 LatinViewController 实例。 【参考方案1】:

您遇到的问题是您正在创建 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

【讨论】:

【参考方案2】:

它返回 nil 因为你创建新的 LatinViewController 的destinationVC 不是你当前segue 的viewController

let destinationVC = LatinViewController()

改成这样:

let destinationVC = segue.destination as? LatinViewController

【讨论】:

以上是关于为啥我的变量值在 Swift 中恢复?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 调试器显示不正确的变量值

django 可以修改模板中的变量值吗?

检查内联函数内的变量值

无法减去 oracle 形式的变量值

如何在后续推送通知中保留通知服务扩展中的变量值

Django Templates — 将模板中的变量值传递给 templatetags 过滤器