我有一段代码,允许用户输入他们的名字,并在按下按钮时前进到下一个屏幕。如果没有输入值,程序不应允许用户继续前进。程序确实检测何时没有输入名称,并且没有移动到下一个屏幕,但是以NSException类型的未捕获异常终止。我想允许用户继续输入值(名称),直到实际输入名称(即名称值不为空)。我有什么办法可以做到这一点。虽然/ 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")
}
答案 0 :(得分:0)
崩溃是因为当你的数组为零时,你试图访问count
characters
数组。变化
if name.characters.count != 0
到
if !name.isEmpty
答案 1 :(得分:0)
如果textfield为空,则分配空字符串。
self.name = NameInput.text ?? ""
或
if !NameInput.text.isEmpty {
}
如果文本字段为空,则不要将!
放入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}
匹配任何语言的任何类型的信件
字面匹配字符(区分大小写)
\.
匹配角色。字面意思(区分大小写)
\-
匹配字符 - 字面意思(区分大小写)
$
断言字符串末尾的位置,或者在字符串末尾的行终止符之前(如果有的话)
从此处测试您的姓名 https://regex101.com/#javascript
答案 2 :(得分:0)
处理可选变量时遇到问题。 UITextField .text属性是可选的。 我希望name是你在NameInput中存储用户输入的属性。 只需将您的name属性声明为可选。 var name:String?
点击操作
@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
}
}