【发布时间】:2016-07-19 17:55:27
【问题描述】:
我有一个包含 UITextView 的 UIView 子类 (MyView)。我希望MyView 对所有UIResponder 方法使用UITextView,如下所示:
@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
但是,当我阅读Apple's Event Delivery: The Responder Chain documentation 时,我认为这可能是一个不正确的实现。我找不到任何有关如何创建 UIResponder 和另一个 UIResponder 的文档或帖子。
UIKit 的概念正好是 1 个firstResponder,所以当MyView 处理-becomeFirstResponder 并返回YES 时,UIKit 认为MyView 是firstResponder 似乎是合理的。但是,由于我在-[MyView becomeFirstResponder] 中依次调用-[UITextView becomeFirstResponder],所以两者中的一个必须赢,一个必须输。哪个赢哪个输?如果UITextView 是firstResponder,那么-[MyView isFirstResponder] 为什么要返回YES?
有人有什么建议吗?我上面的实现正确吗?
【问题讨论】:
标签: uikit uiresponder