【问题标题】:Counting characters of a UITextField crashes with NSExceptionUITextField 的字符计数因 NSException 而崩溃
【发布时间】:2017-10-02 00:20:27
【问题描述】:

我有一段代码允许用户输入他们的姓名并在按下按钮时前进到下一个屏幕。如果未输入任何值,程序不应允许用户继续前进。该程序确实检测到何时没有输入名称并且不会移动到下一个屏幕,但会以 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")
            }

【问题讨论】:

  • 我认为需要self. in self.name.characters.count

标签: swift uitextfield segue action


【解决方案1】:

它崩溃是因为你试图访问 characters 数组中的 count 时它为 nil。改变

if name.characters.count != 0

if !name.isEmpty

【讨论】:

    【解决方案2】:

    如果文本字段为空,则分配空字符串。

    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

    【讨论】:

      【解决方案3】:

      这是处理可选变量的问题。 UITextField .text 属性是可选的。 我希望 name 是您在 NameInput 中存储用户输入的属性。 只需将您的 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
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2018-05-04
        • 2014-05-30
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多