textFieldShouldReturn在没有UITextFieldDelegate的情况下调用

时间:2015-05-20 11:08:42

标签: objective-c uitextfielddelegate

我有一个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仍然被调用。 怎么可能?

2 个答案:

答案 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不再可能,这将导致编译器错误。