2009-10-23 77 views
1

我已经定义了控制器来接收事件。iphone SDK:不知道为什么我没有收到UITextField事件?

@interface salesViewController : UIViewController 
    <UITextFieldDelegate>{ 

但是,我的任何事件都没有发射。

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

在Interface Builder中,我将TextField委托指定给salesView。

我错过了什么?

+0

Interface Builder中的文件所有者是否设置为salesViewController类? 轻微的挑剔,通常是你想用大写字母开头的类名。 –

回答

5

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

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


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

你会收到的事件。或者,您也可以在Interface Builder中设置代理,并在loadView中以编程方式进行代理,分配字段并设置代理。

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

+0

我意识到你有代表挂钩。你确定你有网点/代表设置正确吗? –

+0

我按照建议在代码中设置了委托。工作很好。谢谢。 –

2

你想完成什么?每当用户选择文本字段时都会发送textFieldDidBeginEditing消息。如果您尝试在用户进行编辑时更新标签或其他内容,则需要设置一个观察者,并观察发生这种情况时发出的通知。如果采取此方法,请务必删除观察者一次你用它

例如做:

#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]; 
    } 
} 
相关问题