让IQKeyboardManager兼容YYTextView框架

2017-02-27 14:30小小哆Objective-C相关,iOSDev评论(1)

最近开发的新项目需要用到IQKeyboardManager对键盘今天监听,但却与YYTextView不兼容。于是就翻翻各位大神的代码来添加兼容。

iOS7下让IQKeyboardManager兼容YYTextView框架:

IQKeyboardManager支持iOS7的最后一个版本是3.3.7,这个版本下需要修改框架代码才可兼容。
进入IQKeyboardManager.m,在第231行添加对YYText的监听

//  Registering for YYTextView notification.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidBeginEditing:) name:@"YYTextViewTextDidBeginEditing" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidEndEditing:) name:@"YYTextViewTextDidEndEditing" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidChange:) name:@"YYTextViewTextDidChange" object:nil];

接着在大约1198行(因为上面添加了监听,原代码行数发生改变)

if ([_textFieldView isKindOfClass:[UITextView class]] && _textFieldView.inputAccessoryView == nil)

改成如下,添加对YYTextView的支持

if (([_textFieldView isKindOfClass:[UITextView class]] && _textFieldView.inputAccessoryView == nil) || [NSStringFromClass([_textFieldView class]) isEqualToString:@"YYTextView"])

这样IQKeyboardManager的3.3.7版本就可以支持YYTextView了。
但还有一个BUG,稍后再说,再来说说IQKeyboardManager 3.3.7版本之后(支持iOS8)如何让其兼容YYTextView

iOS8下让IQKeyboardManager兼容YYTextView框架:

在本文发布时,IQKeyboardManager新版已经添加对第三方自定义的TextView的方法。
方法如下:

[[IQKeyboardManager sharedManager] registerTextFieldViewClass:[YYTextView class] didBeginEditingNotificationName:YYTextViewTextDidBeginEditingNotification didEndEditingNotificationName:YYTextViewTextDidEndEditingNotification];

详见:https://github.com/hackiftekhar/IQKeyboardManager/issues/455

已发现的BUG

目前使用时,如果用registerTextFieldViewClass这个方法来注册兼容TextView,会出现第一次使用YYTextView时,IQKeyboardManager不弹出ToolBar

关于这个问题,由于博主的项目需支出iOS7,所以没用这个方法来注册,暂时没去研究解决方法。

点击YYTextView控件,每次都会发起“BeginEditing”的通知,导致无法复制粘贴内容

关于这个问题,博主研究发现,是因为IQKeyboardManager给YYTextView添加了手势,使其点击的时候回辞去第一响应者,而YYTextView却通过判断是否第一响应者来是否发起通知(代理等操作),所以导致无法复制、粘贴等问题。解决方法如下:
进入IQKeyboardManager.m,找到如下代码(大约1229行,3.3.7版本)

[_textFieldView.window addGestureRecognizer:_tapGesture];

替换如下(判断如果不是YYTextView才添加手势)

if (![NSStringFromClass([_textFieldView class]) isEqualToString:@"YYTextView"]) {
    [_textFieldView.window addGestureRecognizer:_tapGesture];
}
上一篇 macOS中在终端下使用Sublime Text打开文本文件屏蔽Xcode 8 在点击UITextField打印出奇怪的Log 下一篇
评论 1

最新评论

    1. 王哼哼
      [[IQKeyboardManager sharedManager].touchResignedGestureIgnoreClasses addObject:NSClassFromString(@"YYTextContainerView")];

      关于你文中说的最后一个问题,如果按你的解决办法的话,会发现 YYTextView 是第一响应者的情况下,键盘就无法收下去了。。然后上面这行代码可以解决 YYTextView 无法粘贴的问题,不需要修改源码。。

      王哼哼 2017-08-14 13:34 回复
由于之前使用多说插件出现问题,导致以前的评论丢失,在此深表歉意!

站点统计

  • 建站日期:2014-12-06
  • 最后更新:2017-02-27
  • 运行时间:1025 天
  • 文章数量:46 篇