概述
在UIWebView中,如果包含文本的输入元素具有焦点,并且按下一个导致输入失焦的按钮,则随后双击输入以重新获得焦点,然后从弹出式栏中选择“剪切(或复制或粘贴)”这样会导致UIWebView崩溃与错误: -[UIWebView cut:]: unrecognized selector sent to instance 0x10900ca60 演示项目:https://github.com/guar在UIWebVIEw中,如果包含文本的输入元素具有焦点,并且按下一个导致输入失焦的按钮,则随后双击输入以重新获得焦点,然后从弹出式栏中选择“剪切(或复制或粘贴)”这样会导致UIWebVIEw崩溃与错误:
-[UIWebVIEw cut:]: unrecognized selector sent to instance 0x10900ca60
演示项目:https://github.com/guarani/WebViewDoubleTapTestTests.git
<HTML> <head> </head> <body> <br><br> <input type="text"> <input type="button"> </body> </HTML>
解决方法
这是一个苹果BUG.问题是剪切:操作在响应者链中发送不正确,最终被发送到UIWebVIEw实例,而不是实现该方法的内部UIWebdocumentVIEw.
直到Apple修复了这个BUG,让我们来看看Objective C的运行时间.
在这里,我将UIWebVIEw子类化,以支持所有的UIResponderStandardEditactions方法,将它们转发到正确的内部实例.
@import ObjectiveC; @interface CutcopyPasteFixeDWebVIEw : UIWebVIEw @end @implementation CutcopyPasteFixeDWebVIEw - (UIVIEw*)_internalVIEw { UIVIEw* internalVIEw = objc_getAssociatedobject(self,"__internal_vIEw_key"); if(internalVIEw == nil && self.subvIEws.count > 0) { for (UIVIEw* vIEw in self.scrollVIEw.subvIEws) { if([vIEw.class.description hasPrefix:@"UIWeb"]) { internalVIEw = vIEw; objc_setAssociatedobject(self,"__internal_vIEw_key",vIEw,OBJC_ASSOCIATION_ASSIGN); break; } } } return internalVIEw; } voID webVIEw_implement_UIResponderStandardEditactions(ID self,SEL selector,ID param) { voID (*method)(ID,SEL,ID) = (voID(*)(ID,ID))[[self _internalVIEw] methodForSelector:selector]; //Call internal implementation. method([self _internalVIEw],selector,param); } - (voID)_prepareForNoCrashes { NSArray* selectors = @[@"cut:",@"copy:",@"paste:",@"select:",@"selectAll:",@"delete:",@"makeTextWritingDirectionleftToRight:",@"makeTextWritingDirectionRightToleft:",@"toggleBoldface:",@"toggleItalics:",@"toggleUnderline:",@"increaseSize:",@"decreaseSize:"]; for (Nsstring* selname in selectors) { SEL selector = NSSelectorFromString(selname); //This is safe,the method will fail if there is already an implementation. class_addMethod(self.class,(IMP)webVIEw_implement_UIResponderStandardEditactions,""); } } - (voID)awakeFromNib { [self _prepareForNoCrashes]; [super awakeFromNib]; } @end
玩的开心.
总结
以上是编程之家为你收集整理的ios – UIWebView Bug: – [UIWebView cut:]:无法识别的选择器发送到实例全部内容,希望文章能够帮你解决ios – UIWebView Bug: – [UIWebView cut:]:无法识别的选择器发送到实例所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。