textFieldDidBeginEditing:用于多个文本字段

时间:2011-04-15 23:39:44

标签: iphone cocoa-touch uitextfield

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

- (void)textFieldDidBeginEditing:(UITextField *)textField

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

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

6 个答案:

答案 0 :(得分:26)

如果我是你,我会将第二个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
    }
}

答案 1 :(得分:16)

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

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

我希望它可以帮到你!

答案 2 :(得分:4)

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

Screenshot of the tab property in IB

在视图控制器的头文件中

#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的title字段来识别它们。例如:

- (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];

答案 3 :(得分:2)

您必须先在控制器UITextFieldDelegate

中声明.h

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

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

    }
}

这对我来说很有效。

答案 4 :(得分:1)

您是否检查过您的第二个textViews委托是否设置为self?我有同样的问题,我忘了设置其他textFields的委托,因此委托方法没有解雇。

答案 5 :(得分:0)

请在本期杂志中查看我的答案,这正是您所需要的 Objective C: what is a "(id) sender"?