2009-10-23 108 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]; 
    } 
} 
相關問題