2015-05-20 5 views
0

У меня есть FooViewController который загружает FooView, а затем добавляет TextField:textFieldShouldReturn называется без UITextFieldDelegate

// FooViewController.m 
@interface FooViewController() <UITextFieldDelegate> 

@end 
... 
-(void)loadView { 
CGRect aFrame = CGRectMake(160, 240, 100, 150); 
FooView *fv = [[FooView alloc] initWithFrame:aFrame]; 
... 
// TextField 
CGRect tfRect = CGRectMake(50, 50, 150, 50); 
UITextField *aTextField = [[UITextField alloc] initWithFrame:tfRect]; 
aTextField.borderStyle = UITextBorderStyleRoundedRect; 
aTextField.returnKeyType = UIReturnKeyDone; 
aTextField.delegate = self; 
[fv addSubview:aTextField]; 
self.view = fv; 
} 

В этом классе реализации (FooViewController.m), у меня есть следующий метод:

-(BOOL)textFieldShouldReturn:(UITextField *)textField { 
    return YES; 
} 

Весь код работает хорошо.

Просто из любопытства я удалил упоминание <UITextFieldDelegate>, и textFieldShouldReturn по-прежнему вызывается. Как это возможно?

ответ

0

Это нормально,

Есть 2 способа реализации безопасного делегирования

1)

if ([self.delegate respondsToSelector:@selector(textFieldShouldReturn)]) { 
    [self.delegate textFieldShouldReturn]; 
} 

2)

if ([self.delegate respondsToProtocol:@protocol(UITextFieldDelegate)]) { 
    [self.delegate textFieldShouldReturn]; 
} 

Кажется, компания Apple использует первый, так что ваш экземпляр отвечает на textFieldShouldReturn и выполняется вызов.

+0

Спасибо за ваш ответ. Есть ли у вас (документация) ссылка? – Zakaria

+0

нет, но при назначении textfield.delegate = self; он предупредит вас, что сам не отвечает на UITextFieldDelegate, но реализованные методы будут называться – l0gg3r

0

Objective-C не является безопасным по типу, как другие языки, и не имеет значения, явно ли делегирует делегат соответствие с использованием <UITextFieldDelegate>. Необходимые методы делегатов будут всегда вызываться, и если они не будут реализованы, будет выбрано исключение.

Если ваш класс контроллера (и его суперкласса) не объявлять <UITextFieldDelegate> то следующий код должен вызвать предупреждение компилятора:

// warning that controller does not declare <UITextFieldDelegate> 
textField.delegate = controller; 

Обратите внимание, что с Swift это уже не возможно и приведет к ошибке компиляции вместо.

+0

Я пробовал, и он не вызвал исключение, а также справиться с чужим ответом действительно приятно, да? – l0gg3r

+0

Поскольку 'UITextFieldDelegate' не имеет * любых * необходимых методов, это никогда не вызовет исключение во время выполнения. Например, 'UITableViewDataSource' имеет требуемые методы, которые будут вызывать исключение во время выполнения, если оно не реализовано. – fluidsonic

 Смежные вопросы

  • Нет связанных вопросов^_^