我有一个FooViewController,它加载一个FooView,然后添加一个TextField:
// 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 :(得分:0)
没关系,
有两种方法可以实现安全委派
1)
if ([self.delegate respondsToSelector:@selector(textFieldShouldReturn)]) {
[self.delegate textFieldShouldReturn];
}
2)
if ([self.delegate respondsToProtocol:@protocol(UITextFieldDelegate)]) {
[self.delegate textFieldShouldReturn];
}
似乎Apple使用第一个,因此您的实例会响应textFieldShouldReturn
并进行通话。
答案 1 :(得分:0)
Objective-C不像其他语言那样是类型安全的,并不关心委托是否使用<UITextFieldDelegate>
显式声明一致性。将始终调用所需的委托方法,如果未实现,则将抛出异常。
如果您的控制器类(及其超类)未声明<UITextFieldDelegate>
,则以下代码应该导致编译器警告:
// warning that controller does not declare <UITextFieldDelegate>
textField.delegate = controller;
请注意,使用Swift不再可能,这将导致编译器错误。