【问题标题】:textFieldDidBeginEditing: for more than one textfieldtextFieldDidBeginEditing:用于多个文本字段
【发布时间】:2011-08-06 16:53:45
【问题描述】:

我对 iphone 编程相当陌生,在这里我遇到了一些问题。现在在我的应用程序中,我有两个文本字段,我想在第二个文本字段开始编辑时触发一个事件。现在我正在使用以下功能

- (void)textFieldDidBeginEditing:(UITextField *)textField

但事情是当第一个文本字段开始编辑时触发事件。它不会等待第二个文本字段。有什么方法可以将此函数用于第二个文本字段,或者可能以某种方式知道并将活动文本字段的值传递给它?

我尝试在函数中写入文本字段的名称而不是 (UITextField *)textField,但结果仍然相同。

【问题讨论】:

    标签: iphone cocoa-touch uitextfield


    【解决方案1】:

    每次开始编辑任何文本字段时都会调用该委托方法,因此应该由您来控制发生这种情况时要执行的操作。我建议你这样做:

       -(void)textFieldDidBeginEditing: (UITextField *)textField
       {     
            if (textField == mySecondTextField)
            {
                //Do what you need
            }
            else
            {
                //Do nothing
            }
       }
    

    希望对你有帮助!

    【讨论】:

    • 我完全明白了,这就是我想要做的,但现在该事件没有被触发。这是检查文本字段值的正确方法吗,因为我认为 textField 在以下代码中没有任何内容。请检查我的代码,看看有什么问题,因为现在事件根本没有被触发 -(void)textFieldDidBeginEditing:(UITextField *) textField { if(textField == locationText) { //Doing stuff } 谢谢
    • 确保视图控制器实现UITextFieldDelegate 协议,并且正如 AhmadTK 所说,您告诉文本字段视图控制器是它的委托。也许为了让事情更清楚一点,您应该阅读主题、协议、委托和其他内容。
    • @Vik 你终于让它工作了吗?我希望你做到了。请接受对您帮助最大的答案。谢谢
    • 不,它仍然无法正常工作。我正在使用 locationText.tag = 2 设置标签,但是当我在 didBeginEditing 中打印它时,它在该标签值中没有显示任何内容,所以我不确定,但是当我在没有标签的情况下运行它时会调用该事件,但当然是在错误的文本字段上。有什么建议吗?
    • 最好通过[textField isEqual: mySecondTextField]检查
    【解决方案2】:

    请看一下我在这个问题中的回答,这正是您要找的 Objective C: what is a "(id) sender"?

    【讨论】:

    • @Ahmad,我完全明白了,这就是我想要做的,但现在该事件没有被触发。这是检查文本字段值的正确方法吗,因为我认为 textField 在以下代码中没有任何内容。请检查我的代码,看看有什么问题,因为现在事件根本没有被触发 -(void)textFieldDidBeginEditing:(UITextField *) textField { if(textField == locationText) { //Doing stuff } 谢谢
    • 您希望事件触发的 UITextField 是通过 .XIB 文件构建的,还是您动态添加的?
    • 我以编程方式添加它。我根本没有使用 Interface Builder。
    • 你设置了UITextField的Delegate了吗? yourTextField.delegate = self;
    • 你的 Owner 头文件有 ?
    【解决方案3】:

    如果我是你,我会将第二个 textField 的标签(在 Interface Builder 中)设置为 2,或类似的东西。然后你可以这样做:

    -(void)textFieldDidBeginEditing:(UITextField *)textField {     
        if (textField.tag == 2) {
            //this is textfield 2, so call your method here
        }
    }
    

    编辑:请执行此操作以查看该方法是否被调用:

    -(void)textFieldDidBeginEditing:(UITextField *)textField {     
        NSLog(@"The method was called");
    }
    

    对于 Swift 2.2

    func textFieldDidBeginEditing(textField: UITextField) {
        if textField.tag == 2 {
            //this is textfield 2, so call your method here
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复。但是我可以向 UITextfields 添加标签,因为我没有使用 Interface Builder。我正在以编程方式完成整个事情。这种情况下有可能吗?
    • @Vik,您可以在代码中设置:button.tag = 2[button setTag:2]
    • 嗨,我实际上尝试通过 locationText.tag =2 设置文本字段标签,然后在 textFieldDidBeginEditing: 中通过 if(textField.tag == 2) 检查条件:但它不起作用。同样的事情,事件没有被触发。
    • @Vik 将 NSLog 放入一个空的 textFieldDidBeginEditing: 方法中,看看它是否被调用。您的代表可能有问题。
    • @Vik:检查我的编辑并尝试一下。如果您在控制台中收到消息,请告诉我。
    【解决方案4】:

    利用 Interface Builder 中的 tag property 在运行时识别应用程序中的视图对象。它会让生活变得更轻松,尤其是当您准备好将应用程序本地化为不同语言时。

    在视图控制器的头文件中

    #define kUsernameField 100
    #define kPasswordField 101
    #define kStartButton 300
    

    在视图控制器实现文件中

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        switch (textField.tag) {
            case kUsernameField:
                // do user name stuff
                break;
    
            case kPasswordField:
                // do password stuff
                break;
    
            default:
                NSLog(@"No case statement for %@", [textField description]);
                break;
        }    
    }
    

    你会发现很多教程都使用 UIButton 的标题字段来识别它们。例如:

    - (IBAction)buttonTouchUp:(id)sender {
        UIButton *button = (UIButton *)sender;
    
        // don't like
        if ([button.currentTitle isEqualToString:@"Start"] == NSOrderedSame) {
            // because if localize your for other language then you will have
            // include code for those other language
            //     French: Démarrer
            //     Spanish: Inicio
            // blah blah blah
        }
    
        // better
        if (button.tag == kStartButton) {
            // very simple, no code changes for localization
            // blah blah blah
        }
    
    }
    

    如果是用代码创建对象,可以设置标签:

    button.tag = kStartButton;
    // or
    [button setTag:kStartButton];
    

    【讨论】:

    • 我特别不喜欢使用 Interface builder 设置标签属性的概念,因为现在您在两个非常不同的地方拥有元素的 id,这可能会使其很难维护。我建议您在代码中设置标签属性以避免不一致。
    • 我没有与 IBOutlet 连接的对象怎么办?我不会将每个 UIButton 都连接回视图控制器。这是我喜欢 tag 属性的另一个原因。
    • 嗨,我实际上尝试通过 locationText.tag =2 设置文本字段标签,然后在 textFieldDidBeginEditing: 中通过 if(textField.tag == 2) 检查条件:但它不起作用。同样的事情,事件没有被触发。
    • 是的,我知道它可能会派上用场,只是我不喜欢将标识符放在两个不同的地方,因为它们很容易弄乱。
    • @Vik,如果您在创建标签时设置了tag 属性,并且您将标签的delegate 属性设置为您的视图控制器(很可能是self),那么这将起作用。
    【解决方案5】:

    您是否检查过您的第二个 textViews 委托是否设置为 self ?我有同样的问题,我忘记设置其他文本字段的委托,因此委托方法没有触发。

    【讨论】:

      【解决方案6】:

      你必须在你的控制器.h中首先声明UITextFieldDelegate

      并设置文本字段的委托。前任。 myInput.delegate = self;

      -(void)textFieldDidBeginEditing:(UITextField *)sender
      {
          if ([sender isEqual:myInput])
          {
              NSLog(@"test");
      
          }
      }
      

      这对我来说非常适合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        相关资源
        最近更新 更多