我有一个包含UIView
的{{1}}子类(MyView
)。我希望UITextView
对所有MyView
方法使用UITextView
,如下所示:
UIResponder
但是,正如我通过Apple's Event Delivery: The Responder Chain documentation阅读,我认为这可能是一个不正确的实施。我无法找到有关如何使用其他@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
创建UIResponder
的任何文档或帖子。
UIResponder
的概念恰好为1 UIKit
,因此当firstResponder
处理MyView
并返回-becomeFirstResponder
时,YES
似乎是合理的认为UIKit
是MyView
。但是,由于我依次在firstResponder
内拨打-[UITextView becomeFirstResponder]
,其中一个必须赢,而且必须输掉一个。哪个胜利哪个失败?如果-[MyView becomeFirstResponder]
是UITextView
,那么为什么firstResponder
应该返回-[MyView isFirstResponder]
?
有没有人有任何建议?我上面的实现是否正确?
答案 0 :(得分:0)
虽然我找到了other evidence that people solved this problem the same way。这个实现给我带来了问题。 TLDR:我认为您不应该撰写UIResponder
个对象。
我的错误:
MyView
上调用方法,MyView
以编程方式调用-[UITextView becomeFirstResponder]
。没有人可以点击MyView
的内部UITextView
。UITextView
是否为firstResponder
,因为私有API -[UIApplication.sharedApplication.keyWindow firstResponder]
会返回UITextView
。[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]
,但此调用返回NO
。在进行此次通话时,UIKit
并未拨打-[UITextView canPerformAction:withSender:]
或-[UITextView targetForAction:withSender:]
。但是,如果相反:
MyView
' UITextView
UITextView
是否为firstResponder
,因为私有API -[UIApplication.sharedApplication.keyWindow firstResponder]
会返回UITextView
。[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]
,现在此调用返回YES
。在进行此次通话后,UIKit
按预期调用-[UITextView canPerformAction:withSender:]
和-[UITextView targetForAction:withSender:]
,然后调用成功的-[UITextView resignFirstResponder]
。我不知道为什么在第一种情况下[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]
没有正确委托给UITextView
,但我必须假设-[MyView becomeFirstResponder]
没有委托给[super becomeFirstResponder]
正如文档所说,有些东西搞砸了。我认为你不应该撰写UIResponder
个对象。
<强> - 编辑 - 强>
我仍然不确定错误,但我发现我的应用中有多个UIWindow
,而且我从People That Know™那里听说过多窗口应用可能会偶尔出现firstResponder
个问题。