首页 > 解决方案 > UITextField 在不是时被视为 nil

问题描述

我有一段代码旨在允许用户更改他们使用的重量单位。如果他们已经输入了一个值,它会自动在公斤和磅之间转换。它通过点击 UISegmentedControl 来更改,其中段 0 是千克,段 1 是磅。

无论用户是从公斤变为磅还是反之,都可以完美地更改第一次。但是,在尝试进行第二次转换时,程序立即崩溃,声称包含 weight 的文本字段中的值为零,即使它明确包含文本。

这是我现在的代码:

@IBAction func unitChanged(_ sender: UISegmentedControl) {
    if let text = weightInput.text, text.isEmpty {
        //Does nothing since there is no weight to change the unit of
    }
    else {
        let weight: Int? = Int(weightInput.text!)
        var weightDouble: Double = Double(weight!)
        
        if (weightTypeInput.selectedSegmentIndex == 0) {
            //The user is trying to change from pounds to kilograms
            weightDouble = weightDouble * 0.45359237
        }
        else {
            //The user is trying to change from kilograms to pounds
            weightDouble = weightDouble * 2.2046226218
        }
        weightInput.text = String(weightDouble)
    }
}

这是代码在实践中的样子

最后这是我收到的错误消息:

线程 1:致命错误:在展开可选值时意外发现 nil

如果我为 weightDouble 设置默认值,则它始终用于所有后续转换尝试。这里有没有人遇到过类似的问题?我试图在网上搜索,但找不到任何帮助。

标签: swiftxcode

解决方案


你确定你的 TextField 的文本值是 nil 吗?因为你只是在第一次检查它,如果我认为情况并非如此。

Int 无法解析带有浮点数的数字。执行此操作时返回 nil。您可能希望先将其解析为 Double,然后再将其转换为 Int。

我认为您的代码应如下所示:

@IBAction func unitChanged(_ sender: UISegmentedControl) {
    guard let text = weightInput.text, !text.isEmpty, var weightDouble = Double(text) else { return }
    
    if (weightTypeInput.selectedSegmentIndex == 0) {
        //The user is trying to change from pounds to kilograms
        weightDouble = weightDouble * 0.45359237
    }
    else {
        //The user is trying to change from kilograms to pounds
        weightDouble = weightDouble * 2.2046226218
    }
    
    weightInput.text = String(Int(weightDouble))
}

推荐阅读