应用程序崩溃,因为uiTextfield中没有值

时间:2016-01-10 11:45:22

标签: swift uitextfield

当我在UiTextField中输入一个值并按下添加按钮时,该应用程序运行正常,但是当我不在UiTextField中输入值时,请按添加按钮,整个应用程序崩溃。有人可以帮助我并告诉我光明。请提前感谢您,并祝福您和您的家人。

这是我的代码

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.textFild.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBOutlet var textFild: UITextField!

    @IBAction func ButtonAwesome(sender: AnyObject) {



        let value:Double = Double(textFild.text!)!


        let sum:Double = value - 1;



        let alert = UIAlertController(title: "km", message:  "\(sum)", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Exit", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert,animated: true, completion: nil)



    }


    func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString stringer: String) -> Bool
    {

        if (textField.text == "" && (stringer == ".")) {
            return false;
        }


        let countdots = textField.text!.componentsSeparatedByString(".").count - 1

        if countdots > 0 && stringer == "."
        {
            return false
        }


        return true
    }




}

3 个答案:

答案 0 :(得分:2)

更强大的解决方案是使用nil合并运算符断言value的初始化永远不会失败。

@IBAction func ButtonAwesome(sender: AnyObject) {
    let value = Double(textFild.text ?? "0") ?? 0
    let sum:Double = value - 1;

    let alert = UIAlertController(title: "km", message:  "\(sum)", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Exit", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert,animated: true, completion: nil)
}

这适用于textField.textnil""(空)或某些无法使用的字符的以下任何“意外”值初始化Double类型变量(例如"a")。对于所有这些情况,value的值为0

作为示例,请考虑以下比较安全和不安全的方法来解决您的初始运行时异常。

我们首先看一下强行打开选项的危险 - 不是一个安全的解决方案。如果textField.text包含nil或非数字字符,例如"a"?结果:

var myTextFieldText : String? = nil

/* Example 1: nil value causes runtime error */
if myTextFieldText != "" { // this is 'true' -> enter if closure
    let value:Double = Double(myTextFieldText!)!
    /* this will fail at run time since we are forcibly (un-safely)
       unwrapping an optional containing 'nil'                           */
}

/* Example 2: non-numeric string character causes runtime error */
myTextFieldText = "a"
if myTextFieldText != "" { // this is 'true' -> enter if closure
    let value:Double = Double(myTextFieldText!)!
    /* this will fail at run time since we cannot initalize a
       Double with a string value "a", hence 'Double(myTextFieldText!)'
       returns nil, but since we've appended '!', we, like above,
       forcibly tries to unwrap this optional of value nil              */
}

通常,您应该始终使用条件展开选项,以避免在强行解包选项时遇到nil值,后者会导致运行时错误。

上述示例的更强大版本,使用了nil合并运算符:

myTextFieldText = nil

let valueA = Double(myTextFieldText ?? "0") ?? 0 // 0
/* OK, Double(myTextFieldText ?? "0") = Double("0") = 0                  */

myTextFieldText = "a"
let valueB = Double(myTextFieldText ?? "0") ?? 0 // 0
/* OK, Double(myTextFieldText ?? "0") = Double("a") = nil (fails)
    => use rhs of outer '??' operator: nil ?? 0 = 0                      */

对于替代方法,您可以将UITextField扩展为覆盖字符串到数字类型转换需求,请参阅以下主题中的Leos整齐答案:

该主题还包含一些其他有价值的见解w.r.t.从UITextField个实例中读取文本作为数值。

最后,在处理String to Double值转换时,使用固定精度w.r.t可能是合适的。生成的Double值中的小数位数。有关如何使用NSNumberFormatter和扩展程序执行此操作的详细示例,请参阅:

答案 1 :(得分:1)

请用以下代码替换你的buttonAwesome方法,检查textfield是否为空,如果textfield有值,这将有效:

@IBAction func ButtonAwesome(sender: AnyObject) {

    if textFild.text != "" {

    let value:Double = Double(textFild.text!)!


    let sum:Double = value - 1;


    let alert = UIAlertController(title: "km", message:  "\(sum)", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Exit", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert,animated: true, completion: nil)

    }

}

答案 2 :(得分:0)

由于textfield.text是一个可选值,因此在您的情况下,textfield可以有或没有文本。所以你应该测试下面给出的可选项。

if let textIsAvailable = textfield.text
{
        print("Text \(textIsAvailable)")
}

注意:崩溃的原因是您正在尝试访问实际上没有任何价值的值。