【问题标题】:Swift I have four textfields and one submit button, how can I make the button active only when all textfields have a stringSwift 我有四个文本字段和一个提交按钮,只有当所有文本字段都有一个字符串时,我才能使按钮处于活动状态
【发布时间】:2023-04-06 16:47:01
【问题描述】:

我的代码的问题是用户必须点击离开 从第四个字段到提交按钮的不同字段 再次活跃起来

@IBOutlet weak var enterPlayer1: UITextField!
@IBOutlet weak var enterPlayer2: UITextField!
@IBOutlet weak var enterPlayer3: UITextField!
@IBOutlet weak var enterPlayer4: UITextField!

@IBOutlet weak var submit: UIButton!


func textFieldDidBeginEditing(textField: UITextField) -> Bool 
{       
     if enterPlayer1.text != "" && enterPlayer2.text != "" && enterPlayer3.text != "" && enterPlayer4.text != "" 
     {    
         submit.enabled = true
     } else {
         submit.enabled = false
     }

     return true         
 }


override func viewDidLoad() {
    super.viewDidLoad()

    enterPlayer1.delegate = self
    enterPlayer2.delegate = self
    enterPlayer3.delegate = self
    enterPlayer4.delegate = self

    submit.enabled = false

    //submit.enabled = false
    // Do any additional setup after loading the view.
}

【问题讨论】:

    标签: swift uibutton ios8 uitextfield


    【解决方案1】:

    我们需要在文本完成更改后查看文本字段。没有一个UITextFieldDelegate 方法实际上回调委托以处理“didChangeCharacters”之类的事件。

    相反,我们可以为此创建一个IBAction

    右键单击您的一个文本字段以获取屏幕截图中显示的弹出菜单。单击并从“Editing Changed”圆圈拖动到您的视图控制器类中以创建方法。

    现在您可以从同一位置单击并拖动其他文本字段,但对于其他文本字段,而不是创建新方法,而是将它们挂接到此方法中。

    当你把所有东西都连接起来后,你的插座可能看起来像这样:

    这里最重要的是看到所有四个文本字段都与 Received Actions 挂钩。在这个例子中,我将我的方法称为“textChanged”。

    现在,只需编写您的验证代码。在这种情况下,以下“textChanged”方法将起作用:

    @IBAction func textChanged(sender: UITextField) {
        self.button.enabled = self.field1.text != "" && self.field2.text != "" 
            && self.field3.text != "" && self.field4.text != ""
    }
    

    虽然严格来说,这个确切的验证很有可能会崩溃,因为UITextFieldtext 属性可以是nil

    【讨论】:

    • 我尝试了你的方法,但我又回到了同样的问题,当我完成字段 4 后,我必须点击另一个字段才能激活按钮
    • 确保使用正确的操作连接所有文本字段。
    • 我做到了,我什至用四个文本字段和一个按钮创建了一个新项目。一旦您开始输入文本,该按钮就不会启用。
    【解决方案2】:

    我宁愿把它投入到这样的行动中:

    @IBAction func loginPressed(){
    if(enterPlayer1.text == "" ){
        myBool = NO
    }
    if(enterPlayer2.text == ""){
        myBool = NO
    }
    if(enterPlayer3.text == "" ){
        myBool = NO
    }
    if(enterPlayer4.text == ""){
        myBool = NO
    }
    
    if (myBool){
        //Rest of code here
    }
    

    }

    【讨论】:

    • 好的,但是如果我开始在底部字段中输入文本,按钮就会启用
    • 好吧,不如用 countElements(enterPlayer1.text) > 计算玩家名字的长度(随便你怎么设置)
    【解决方案3】:

    尝试重写以下 UITextViewDelegate 方法

    optional func textField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool" UITextFieldDelegate method instead:
    

    基本上,

    override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> BOOL
    {
        if enterPlayer1.text != "" && enterPlayer2.text != "" 
           && enterPlayer3.text != "" && enterPlayer4.text != "" 
        {        
            submit.enabled = true
        } 
        else 
        {
            submit.enabled = false
        }
    
        return true
    }
    

    【讨论】:

    • 我刚做了,效果还是一样。用户在完成第四个文本文件后必须单击不同的文本字段才能运行代码
    • 哎呀,对不起..我刚刚更新了我的帖子。基本上这会在每次编辑时检查文本字段。我希望这会更好!
    • 完美!!!!非常感谢,我这两天一直在尝试自己做。这正是我想要的
    • 我唯一注意到的是最后一个文本字段必须至少有两个字符才能使按钮再次变为活动状态
    • 鉴于在调用此方法时文本实际上并未更改,因此这不是真正的正确方法。
    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 2019-05-28
    • 1970-01-01
    • 2011-05-24
    • 2016-12-03
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多