代码之家  ›  专栏  ›  技术社区  ›  nc14

Swift 4-仅将一个文本字段标识为用于编辑的委托Dindend等

  •  0
  • nc14  · 技术社区  · 7 年前

    我把这个问题排除在特定的上下文之外,因为我相信它会对其他人有所帮助:

    我有两个ib outlet文本字段:

    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    

    我希望能够禁用页面上的按钮,直到两个按钮都正确填写,这样我就可以在viewdidload()中使用以下委托(我已经将textfieldDelegate添加到我的vc中)。

    override func viewDidLoad() {
        textField1.delegate = self
        textField2.delegate = self
    }
    

    然后我将使用一些函数来进行表单验证和采取特定的操作,但是为了保持简单,我们假设它只是打印到控制台。

    我要做的只是在textfield1中检查验证,而不是在textfield2中检查验证。也就是说,所需的输出是当用户开始编辑textfield1时打印,但如果用户编辑textfield2,则不打印任何内容。

    我目前正在使用:

    func textFieldDidBeginEditing(_ textField1: UITextField) {
        print("TextField did begin editing method called")
    }
    

    但这是在编辑文本字段时打印的。

    我以为我已经指定了uutextfield1,所以不知道为什么两者都触发了它?

    对于Swift 3和更早版本,有一些解决类似问题的答案。特别是有一个答案引用了这个链接 http://sourcefreeze.com/uitextfield-and-uitextfield-delegate-in-swift/ 我发现这是有用的,但仍然坚持这个错误。

    6 回复  |  直到 7 年前
        1
  •  7
  •   Kuldeep Jayesh Lathiya    7 年前

    UITextField 委托方法允许您识别 textField 正在开始编辑,因此您只需检查它是否是您的第一个 文本字段 或者不是这样。

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == self.textField1 {
            print("TextField did begin editing method called")
            // Do your Validate for first text field
        } else {
            //Do Nothing
        }
    }
    
        2
  •  2
  •   Oscar Apeland    7 年前

    这就是为什么委托函数 textFieldDidBeginEditing 有一个 textField 参数。重命名它没有任何作用。

    如果要识别文本字段,请比较 文本字段 参数到您的 IBOutlet S,就像这样:

    func textFieldDidBeginEditing(_ text Field: UITextField) {
        if textField == textField1 {
            // Validate first text field
        } else if textField == textField2 {
            // Validate second text field
        }
    
    }
    
        3
  •  2
  •   Abhay Singh    7 年前

    只需将两个文本字段的标记都设置为0和1,然后在委托方法中只需检查文本字段的标记。

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField.tag == 0 {  
            print("TextField did begin editing method called for text field 1")
        }
    }
    
        4
  •  2
  •   Mr. Xcoder    7 年前

    让我们首先分析一下您的代码,看看有什么问题:

    func textFieldDidBeginEditing(_ textField1: UITextField) {
        print("TextField did begin editing method called")
    }
    

    您重命名了 textField textField1 . 但是,确实如此 命名应负责此操作的UI元素。相反,这是一个 function parameter 它允许您访问有关从函数内部调用操作的对象的信息,而不考虑外部范围。相反,您应该使用 === operator ,它检查两个引用是否指向同一对象实例。所以你的代码应该是:

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField === self.textField1 {
            print("TextField 1 did begin editing method called")
        }
    }
    
        5
  •  2
  •   Kuldeep Jayesh Lathiya    6 年前

    您已经命名了接收 UITextField 证明人是 传递给委托方法 textField1 ;此参数的名称与属性的名称无关。你可以叫它 textField 尽管没有名为 文本字段 .

    您需要比较 输入框 传递给委托方法的:

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField === self.textField1 {  
            print("TextField did begin editing method called for text field 1")
        }
    }
    
        6
  •  1
  •   sanjaykmwt    7 年前

    两种方法都可以 if 条件 textfield 就像保罗说的,或者如果您不希望textfield2与任何textfield委托一起工作,您可以删除该行。

      textField2.delegate = self