那在什么场景中会出现这种情况呢?

如果一个包含文字的输入元素有焦点,然后按钮的点击会导致输入失去焦点,然后接下来在输入时双按会重新得到焦点并从弹出bar中选择剪切复制粘贴,就会导致此error。

也就是说当WebView页面中的HTML中有如下代码的时候

<input type="text">
<input type="button" >

即有输入框和按钮的时候,会出现 [UIWebView cut:]: unrecognized selector sent to instance 的错误风险

简单的说就是若有一个WebView中有输入框,又有按钮的话,执行下面的操作就会出现这样的错误:

1.在输入框中输入内容。

2.点击Button让键盘消失。

3。双击输入框中的内容出现选择的bar后点击剪贴。就会出现闪退的现象。

的具体错误如下:

-- ::59.495 WebViewCutErrorDemo[:] -[UIWebView cut:]: unrecognized selector sent to instance 0x7f9612f19f40
-- ::59.497 WebViewCutErrorDemo[:] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIWebView cut:]: unrecognized selector sent to instance 0x7f9612f19f40'
*** First throw call stack:
(
CoreFoundation 0x000000010ddb6f45 __exceptionPreprocess +
libobjc.A.dylib 0x000000010d82edeb objc_exception_throw +
CoreFoundation 0x000000010ddbf56d -[NSObject(NSObject) doesNotRecognizeSelector:] +
CoreFoundation 0x000000010dd0ceea ___forwarding___ +
CoreFoundation 0x000000010dd0ca98 _CF_forwarding_prep_0 +
UIKit 0x000000010e6a3923 -[UICalloutBar buttonPressed:] +
UIKit 0x000000010e6a1e47 -[UICalloutBarButton fadeAndSendAction] +
Foundation 0x000000010d416c39 __NSFireDelayedPerform +
CoreFoundation 0x000000010dd17264 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ +
CoreFoundation 0x000000010dd16e11 __CFRunLoopDoTimer +
CoreFoundation 0x000000010dcd8821 __CFRunLoopRun +
CoreFoundation 0x000000010dcd7e08 CFRunLoopRunSpecific +
GraphicsServices 0x000000011158fad2 GSEventRunModal +
UIKit 0x000000010e16430d UIApplicationMain +
WebViewCutErrorDemo 0x000000010d32c86f main +
libdyld.dylib 0x00000001104f292d start +
)
libc++abi.dylib: terminating with uncaught exception of type NSException

仔细想想第三方登录的页面有出现这种问题的风险。

有人说这里面说是苹果系统的bug,原因是这种操作在响应链不能正确的发送,并最终发送到UIWebView的实例,而不是内部的UIWebDocumentView。

下面提供一下这种问题的解决方案,思想就是动态的为UIWebView添加响应的方法。

新建一个类 CutCopyPasteFixedWebView 继承 UIWebView

CutCopyPasteFixedWebView.h代码如下

//
// CutCopyPasteFixedWebView.h
// WebViewCutErrorDemo
//
// Created by lidaojian on 15/11/20.
// Copyright © 2015年 lidaojian. All rights reserved.
// #import <UIKit/UIKit.h> @interface CutCopyPasteFixedWebView : UIWebView @end

CutCopyPasteFixedWebView.m代码如下

//
// CutCopyPasteFixedWebView.m
// WebViewCutErrorDemo
//
// Created by lidaojian on 15/11/20.
// Copyright © 2015年 lidaojian. All rights reserved.
// #import "CutCopyPasteFixedWebView.h"
#import <objc/runtime.h> @implementation CutCopyPasteFixedWebView - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
/// 适配防止崩溃
[self prepareForNoCrashes];
}
return self;
} - (UIView *)internalView
{
static const char internalViewKey = '\0';
/// 动态关联
UIView *internalView = objc_getAssociatedObject(self, &internalViewKey);
if (internalView == nil && self.subviews.count > ) {
for (UIView *view in self.scrollView.subviews) {
if ([[view.class description] hasPrefix:@"UIWeb"]) {
internalView = view;
objc_setAssociatedObject(self, &internalView, view, OBJC_ASSOCIATION_ASSIGN);
break;
}
}
}
return internalView;
} void webViewImplementUIResponderStandardEditActions(id self, SEL selector, id param)
{
/// IMP本质就是函数指针 methodForSelector 获得一个指向方法实现的指针,并可以使用该指针直接调用方法实现
IMP imp = [[self internalView] methodForSelector:selector]; /// 函数指针
void (*method)(id, SEL, id) = (void (*) (id, SEL, id))imp; /// 直接用函数指针调用方法
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); /// 若父类没有实现则给父类添加selector方法,若父类实现了,并不修改父类的selector方法
class_addMethod(self.class, selector, (IMP)webViewImplementUIResponderStandardEditActions, "");
}
} @end

另外附上测试的HTML文件

<html>
<head>
</head>
<body>
<br><br>
<input type="text">
<input type="button" >
</body
</html>

若有疑问请加本人QQ:610774281。一起探讨一起进步。。。。

参考连接:

http://stackoverflow.com/questions/21316784/uiwebview-bug-uiwebview-cut-unrecognized-selector-sent-to-instance#

IOS 错误 [UIWebView cut:]: unrecognized selector sent to instance的更多相关文章

  1. iOS:编译错误[__NSDictionaryM objectAtIndexedSubscript:]: unrecognized selector sent to instance 0xa79e61

    这个意思是,__NSDictionaryM  无法将值传到下标索引对象,言简意赅就是数组越界.可是再看看,这是数组吗?不是,所以.遇到这样的crash,我这里有两种情况: 1.首先看看你 indexP ...

  2. -[__NSArrayI removeAllObjects]: unrecognized selector sent to instance 0x7fa8dc830110

    问题 今天做项目,遇到了这个问题 -[__NSArrayI removeAllObjects]: unrecognized selector sent to instance 0x7fa8dc8301 ...

  3. [NSConcreteValue doubleValue]: unrecognized selector sent to instance

    今天需求说要给在进入某个页面给某个按钮加上放大效果,心想这还不简单,于是三下五除二的把动画加上提交测试了. 下面是动画的代码 NSTimeInterval time = CACurrentMediaT ...

  4. iOS 程序报错:reason: [NSArrayI addObject:]: unrecognized selector sent to instance

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI ad ...

  5. CBUUID UUIDString unrecognized selector sent to instance 错误

    CBUUID UUIDString unrecognized selector sent to instance 错误 ios7.0,4s 蓝牙出现上述错误! 查看api可知,错误原因,由于CBUUI ...

  6. ios unrecognized selector sent to instance出现的原因和解决方案

    概述:造成unrecognized selector sent to instance iphone,大部分情况下是因为对象被提前release了,在你心里不希望他release的情况下,指针还在,对 ...

  7. IOS微信API异常:unrecognized selector sent to instance 0x17005c9b0'

    开发IOS整合微信API的时候,在运行程序的过程中可能会在注册你的APPID的时候抛出此异常而导致程序崩溃. 异常描述 [7661:2826851] *** Terminating app due t ...

  8. iOS开发——异常:[__NSCFNumber length]: unrecognized selector sent to instance

      *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumbe ...

  9. Solve Error: 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7fa5c402fa00'

    下面是iOS开发用第三方库可能出现的错误,及其解决方法: 1. 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstra ...

随机推荐

  1. laravel composer 指定版本

    composer create-project laravel/laravel=5.2.* --prefer-dist

  2. tcpdump 获取http请求url

    There are tcpdump filters for HTTP GET & HTTP POST (or for both plus message body): Run man tcpd ...

  3. .NET中的yield关键字

    浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://bl ...

  4. CTE递归查询

    WITH ctetest(AgencyID,ParentAgencyID,level)AS ( SELECT AgencyID,ParentAgencyID,0 level FROM dbo.Web_ ...

  5. toolsqa-IMPORTANCE

    http://toolsqa.com/cucumber/cucumber-options/

  6. hadoop输入分片计算(Map Task个数的确定)

    作业从JobClient端的submitJobInternal()方法提交作业的同时,调用InputFormat接口的getSplits()方法来创建split.默认是使用InputFormat的子类 ...

  7. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(04)

    1.3.3 框架窗口对象 MFC的CWnd类及其派生类为窗口或应用程序创建的窗口提供了面向对象的接口. CMainWindow是从CFrameWnd类派生而来,CFrameWnd模仿框架窗口的行为,可 ...

  8. Informatica相同环境与不同环境的导入导出( Repository Name,Integration Service Name,Folder Name是否相同):

    Informatica相同环境与不同环境的导入导出( Repository Name,Integration Service Name,Folder Name是否相同): 1.repository N ...

  9. win7下Outlook2010禁止访问具有潜在不安全因素的附件的解决办法

    发生情景: 收到.bat .exe等敏感类型附件时,会碰到此问题. 解决方法: 1.打开regedit.exe 2.依次展开HKEY_CURRENT_USER\Software\Microsoft\O ...

  10. SQL简单语法

    (1)select SELECT 列名称 FROM 表名称 (2)distinct SELECT DISTINCT 列名称 FROM 表名称 SELECT * FROM 表名称 (3)where SE ...