我已经定义了控制器来接收事件。
@interface salesViewController : UIViewController
<UITextFieldDelegate>{
然而,我的事件都没有发射。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//this is not getting called
}
在Interface Builder中,我将TextField委托分配给salesView。
我错过了什么?
答案 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];
}
}