Swift UITextField的字符计数与NSException一起崩溃

Swift UITextField的字符计数与NSException一起崩溃,swift,uitextfield,segue,action,Swift,Uitextfield,Segue,Action,我有一段代码,可以让用户在按下按钮时输入自己的姓名并进入下一个屏幕。如果未输入任何值,程序不应允许用户继续。当未输入任何名称时,程序会进行检测,并且不会移动到下一个屏幕,但会以NSException类型的未捕获异常终止。我希望允许用户继续输入值(名称),直到实际输入名称(即名称值不为空)。我有没有办法去做那件事。While/for循环似乎不起作用 @IBAction func NameEditingDidChange(_ sender: Any) { NextButto

我有一段代码,可以让用户在按下按钮时输入自己的姓名并进入下一个屏幕。如果未输入任何值,程序不应允许用户继续。当未输入任何名称时,程序会进行检测,并且不会移动到下一个屏幕,但会以NSException类型的未捕获异常终止。我希望允许用户继续输入值(名称),直到实际输入名称(即名称值不为空)。我有没有办法去做那件事。While/for循环似乎不起作用

@IBAction func NameEditingDidChange(_ sender: Any) {

            NextButton.isEnabled = true

    }
    // Once button is pressed
        @IBAction func NextButtonPressed(_ sender: Any) {
    // Gets user's name from textfield
    print("12345abcde")

    self.name = NameInput.text!

    // If textfield is not empty, moves to next storyboard

            if name.characters.count != 0 {

                print("in ")

                performSegue(withIdentifier: "fistBump", sender: nil)

            }
            else {
// Prints this line and terminates
                print("text field is empty")
            }

它崩溃是因为当数组为零时,您试图访问
字符的
计数
。改变

if name.characters.count != 0


如果textfield为空,则分配空字符串

self.name = NameInput.text  ?? "" 

不要放
NameInput.text用于强制展开原因,如果文本字段为空则崩溃

用这种方法尝试是否为有效名称

 func isValidName(testStr:String) -> Bool {
        // print("validate name: \(testStr)")
        let nameRegEx = "^[\p{L} \.\-]+$"

        let nameTest = NSPredicate(format:"SELF MATCHES %@", nameRegEx)
        return nameTest.evaluate(with: testStr)
    }
^[\p{L}.]+$

^
断言字符串开头的位置

匹配下面列表中的单个字符
[\p{L}\.\-]+

+
量词
-
在一次和无限次之间匹配,尽可能多地匹配,根据需要回馈(贪婪)

\p{L}
匹配来自任何语言的任何类型的字母 逐字匹配字符(区分大小写)
\。
与字符匹配。字面意思(区分大小写)
\-
匹配字符-字面上(区分大小写)

$
在字符串末尾或字符串末尾的行终止符(如果有)之前断言位置


在这里测试你的名字

这是处理可选变量的问题。 UITextField.text属性是可选的。 我希望name是存储用户输入到NameInput中的you属性。 只需将您的name属性声明为可选。 变量名称:字符串

在点击操作中

    @IBAction func NextButtonPressed(_ sender: Any) {
        // Gets user's name from textfield            
        self.name =         NameInput?.text?.stringByReplacingOccurrencesOfString(" " , withString: "")            
        // If textfield is not empty, moves to next storyboard
        if self.name?.characters.count > 0 {// Navigate now
        }
    }

我想需要
self.
self.name.characters.count中。
 func isValidName(testStr:String) -> Bool {
        // print("validate name: \(testStr)")
        let nameRegEx = "^[\p{L} \.\-]+$"

        let nameTest = NSPredicate(format:"SELF MATCHES %@", nameRegEx)
        return nameTest.evaluate(with: testStr)
    }
    @IBAction func NextButtonPressed(_ sender: Any) {
        // Gets user's name from textfield            
        self.name =         NameInput?.text?.stringByReplacingOccurrencesOfString(" " , withString: "")            
        // If textfield is not empty, moves to next storyboard
        if self.name?.characters.count > 0 {// Navigate now
        }
    }