自定义 inputaccessoryView 中的 UITextView 不退出第一响应者状态

Posted

技术标签:

【中文标题】自定义 inputaccessoryView 中的 UITextView 不退出第一响应者状态【英文标题】:UITextView in custom inputaccessoryView not resigning first responder status 【发布时间】:2017-12-18 10:06:00 【问题描述】:

我有一个聊天应用程序,它实现了一个浮动文本输入字段(类似于 ios 消息应用程序)作为我的 ChatViewControllerinputAccessoryView(参见 Apple's documentation)。

class ChatViewController: UIViewController 

    override var inputAccessoryView: UIView? 
       return chatInputView
    

    override var canBecomeFirstResponder: Bool 
        return true
    
    ...

我的ChatViewController 有一个ChatTableViewController 子视图控制器,它的单元格包含UITextFields,其文本内容是可编辑的。我遇到的问题是,当用户点击单元格的UITextField 时,inputAccessoryViewUITextView 拒绝放弃第一响应者状态,这会阻止UITableViewCell 中的内容被编辑。控制台中记录了以下警告:

 First responder warning: '<UITextView: 0x7fc041041c00; 
 frame = ...' rejected resignFirstResponder when being removed from hierarchy

我尝试直接在UIInputViewUITextView 上调用resignFirstResponderendEditing,但没有成功。我不希望ChatViewController 辞去第一响应者的身份,因为这会导致inputAccessoryView 消失。

编辑:我在交互关闭键盘时也会收到警告(而不是点击UITableViewCellUITextField

【问题讨论】:

尝试 [self.view endEditing:YES] 或 [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; 能把相关的类上传到github上或者邮寄过来吗? @blau 我面临同样的问题,有什么解决方案吗? @Yuvrajsinh 你找到解决方案了吗? @Edan 有人找到解决方案了吗? 【参考方案1】:

请您检查以下内容:

如果UITextView 从超级视图中移除:

UITextView 是否已从视图层次结构中移除? 如果可以,您可以先resignFirstResponder,然后再将其从超级视图中删除。

如果使用UITextView 子类:

您是否使用UITextView 的子类,如果是,您是否实现了canResignFirstResponder 以返回false。 您能否尝试返回 true

【讨论】:

我不会从其超级视图中删除 UITextView。在第一响应者更改后,UITextView 的超级视图仍然是自定义的 UIInputView 子类。我也只是使用一个普通的旧UITextView(不是子类)。 可能是superView 可用,但superView 的superView 可能是nil。您能否继续递归检查superView,直到您到达窗口。 UITextView 需要在层次结构中才能关闭键盘 我已经按照你的建议做了,层次结构如下:UITextView - ChatInputView - UIInputSetHostView - UIInputSetContainerView - UITextEffectsWindow。正如您所建议的那样,UITextView 不是应用程序视图层次结构的一部分,因为我无法递归地到达窗口。我不确定为什么会这样。我不相信我必须手动将它添加到视图层次结构中,因为我读过的所有文档都表明需要做的就是覆盖我的视图控制器中的 inputAccessoryView 属性,并且应该小心的。 UITextEffectsWindow 是什么?我想通常你会直接/间接地将subViews 添加到UIViewController.view。尽量保持简单,在一个新项目上尝试一下。【参考方案2】:

使用 iOS 消息应用和 WhatsApp 时也会显示此警告。没有已知的方法可以摆脱它。它没有负面影响,我认为我们应该忽略它。

【讨论】:

【参考方案3】:

我的解决方案:

    覆盖 canBecomeFirstResponder 到您的 inputAccessoryView 和 inputAccessoryView 上的 UITextField 当用户按下隐藏键盘或返回时,将 canBecomeFirstResponder 设置为 false 从其 superView 中移除 inputAccessoryView

按下隐藏键盘时仍有警告消息,但对我来说效果很好。

【讨论】:

以上是关于自定义 inputaccessoryView 中的 UITextView 不退出第一响应者状态的主要内容,如果未能解决你的问题,请参考以下文章

自定义 inputAccessoryView 将我的 UITableView 第一行部分推离屏幕

更改以编程方式创建的自定义 inputAccessoryView 的高度?迅速 4

swift如何将inputAccessoryView停靠在UIToolbar上方(不是底部)

UITableView 作为 inputAccessoryView 的高度为零

如何使用 Swift 在 CustomCell 中实现 inputAccessoryView 到 UITextField?

InputAccessoryView 边框?