I have a UIView
subclass (MyView
) that contains a UITextView
. I want MyView
to use UITextView
for all UIResponder
methods like so:
@implementation MyView
- (BOOL)canBecomeFirstResponder {
return _textView.canBecomeFirstResponder
}
- (BOOL)becomeFirstResponder {
return [_textView becomeFirstResponder];
}
- (BOOL)canResignFirstResponder {
return [_textView canResignFirstResponder];
}
- (BOOL)resignFirstResponder {
// UIResponder documentation says [super resignFirstResponder]
// must be called somewhere in this method
BOOL superResignedFirstResponder = [super resignFirstResponder];
if (superResignedFirstResponder) {
return [_textView resignFirstResponder];
} else {
return NO;
}
}
- (BOOL)isFirstResponder {
return [_textView isFirstResponder];
}
@end
However, as I'm reading through Apple's Event Delivery: The Responder Chain documentation, I think this may be an incorrect implementation. I can't find any documentation or posts about how to create a UIResponder
with another UIResponder
.
UIKit
has a notion of exactly 1 firstResponder
, so when MyView
handles -becomeFirstResponder
and returns YES
, it seems reasonable for UIKit
to think MyView
is the firstResponder
. However, since I in turn call -[UITextView becomeFirstResponder]
within -[MyView becomeFirstResponder]
, one of the two must win and one must lose. Which wins and which loses? If UITextView
is the firstResponder
, then why should -[MyView isFirstResponder]
ever return YES
?
Does anyone have any advice? Is my above implementation correct?