iphone SDK:不知道为什么我没有收到UITextField事件?

时间:2009-10-23 22:04:07

标签: objective-c iphone

我已经定义了控制器来接收事件。

@interface salesViewController : UIViewController
    <UITextFieldDelegate>{

然而,我的事件都没有发射。

 - (void)textFieldDidBeginEditing:(UITextField *)textField
  {
 //this is not getting called
  }

在Interface Builder中,我将TextField委托分配给salesView。

我错过了什么?

2 个答案:

答案 0 :(得分:5)

您必须正确设置委托。您观察协议,但您需要这样做:

@interface YourController : UIViewController<UITextFieldDelegate>   {
    IBOutlet UITextField* field;
}
@end


@implementation YourController
-(void)viewDidLoad
{
    [field setDelegate:self];
}

你会收到这些活动。或者,您也可以在Interface Builder中设置委托,同时在loadView中以编程方式进行,分配字段并设置委托。

此外,尝试尽可能少地使用NSNotificationCenter。除非您和相关对象之间没有真正的直接路径,否则通知会有些过时。只是对上述答案的一点评论。

答案 1 :(得分:2)

你想要完成什么?只要用户选择文本字段,就会向textFieldDidBeginEditing发送消息。如果您在用户进行编辑时尝试更新标签或其他内容,则需要设置一个观察者w / NSNotificationCenter并注意在发生这种情况时触发的通知。如果您采用这种方法,请确保完成后删除观察者

例如:

#pragma mark
#pragma mark -
#pragma mark Notification Observers

- (void)addObservers {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:@"UITextFieldTextDidChangeNotification" object:nil];    
}
- (void)removeObservers {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:nil];
}

如果您需要密切关注多个文本字段,请为您的选择器执行以下操作:

- (void)textFieldDidChange:(NSNotification*)aNotification {
    UITextField *textField = (UITextField *)[aNotification object];
    if([textField isEqual:usernameTextField])
    {           
        [user setUsername:usernameTextField.text];

    }
    else if([textField isEqual:phoneNumberTextField])
    {
        [user setPhoneNumber:phoneNumberTextField.text];
    }
}