通过包含另一个firstResponder(一个UITextView)来创建firstResponder UIView

时间:2016-07-19 17:55:28

标签: uikit uiresponder

我有一个包含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似乎是合理的认为UIKitMyView。但是,由于我依次在firstResponder内拨打-[UITextView becomeFirstResponder],其中一个必须赢,而且必须输掉一个。哪个胜利哪个失败?如果-[MyView becomeFirstResponder]UITextView,那么为什么firstResponder应该返回-[MyView isFirstResponder]

有没有人有任何建议?我上面的实现是否正确?

1 个答案:

答案 0 :(得分:0)

虽然我找到了other evidence that people solved this problem the same way。这个实现给我带来了问题。 TLDR:我认为您不应该撰写UIResponder个对象。

我的错误:

  1. 消费者在MyView上调用方法,MyView以编程方式调用-[UITextView becomeFirstResponder]。没有人可以点击MyView的内部UITextView
  2. 消费者想要解雇键盘。我们可以验证UITextView是否为firstResponder,因为私有API -[UIApplication.sharedApplication.keyWindow firstResponder]会返回UITextView
  3. 消费者调用[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil],但此调用返回NO。在进行此次通话时,UIKit并未拨打-[UITextView canPerformAction:withSender:]-[UITextView targetForAction:withSender:]
  4. 但是,如果相反:

    1. 用户点按了MyView' UITextView
    2. 消费者想要解雇键盘。我们可以验证UITextView是否为firstResponder,因为私有API -[UIApplication.sharedApplication.keyWindow firstResponder]会返回UITextView
    3. 消费者调用[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil],现在此调用返回YES。在进行此次通话后,UIKit按预期调用-[UITextView canPerformAction:withSender:]-[UITextView targetForAction:withSender:],然后调用成功的-[UITextView resignFirstResponder]
    4. 我不知道为什么在第一种情况下[UIApplication sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]没有正确委托给UITextView,但我必须假设-[MyView becomeFirstResponder]没有委托给[super becomeFirstResponder]正如文档所说,有些东西搞砸了。我认为你不应该撰写UIResponder个对象。

      <强> - 编辑 -

      我仍然不确定错误,但我发现我的应用中有多个UIWindow,而且我从People That Know™那里听说过多窗口应用可能会偶尔出现firstResponder个问题。