Решение состоит в том, чтобы ваш подкласс UITextField имел собственный закрытый делегат, который вы вставляете между вашим текстовым полем и его «обычным» делегатом.
Вы должны создать свой закрытый делегат в ваших initWithFrame: и initWithCoder: методови использовать его в качестве вашего делегата.Свойство strong / retain необходимо, поскольку свойство делегата UITextField не сохраняет его содержимое.
@interface MyTextFieldPrivateDelegate: NSObject<UITextFieldDelegate>
@end
@interface MyTextField()
@property (nonatomic, strong) MyTextFieldPrivateDelegate *privateDelegate;
@end
@implementation MyTextField
@synthesize privateDelegate;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.privateDelegate = [[MyTextFieldPrivateDelegate alloc] init];
self.delegate = self.privateDelegate;
}
return self;
}
Вы должны переопределить setDelegate: для вставки вашего частного делегата между ними.
@interface MyTextFieldPrivateDelegate: NSObject<UITextFieldDelegate>
@property (nonatomic, weak) id<UITextFieldDelegate> delegate;
@end
@implementation MyTextFieldPrivateDelegate
@synthesize delegate;
@end
@implementation MyTextField
- (void)setDelegate:(id<UITextFieldDelegate>)delegate
{
if (delegate == self.privateDelegate) {
[super setDelegate:delegate];
} else {
self.privateDelegate.delegate = delegate;
}
}
@end
Ваш личный делегат будет реализовывать вашу пользовательскую textFieldShouldReturn: реализацию и все другие методы UITextFieldDelegate
@implementation MyTextFieldPrivateDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
// ...
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if ([self.delegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) {
return [self.delegate textFieldShouldBeginEditing:textField];
}
return YES;
}
// etc.
@end