IOS 错误 [UIWebView cut:]: unrecognized selector sent to instance

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

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

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

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

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

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

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

2.点击Button让键盘消失。

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

的具体错误如下:

2015-11-20 11:20:59.495 WebViewCutErrorDemo[3381:595295] -[UIWebView cut:]: unrecognized selector sent to instance 0x7f9612f19f40
2015-11-20 11:20:59.497 WebViewCutErrorDemo[3381:595295] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException‘, reason: ‘-[UIWebView cut:]: unrecognized selector sent to instance 0x7f9612f19f40‘
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ddb6f45 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010d82edeb objc_exception_throw + 48
    2   CoreFoundation                      0x000000010ddbf56d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010dd0ceea ___forwarding___ + 970
    4   CoreFoundation                      0x000000010dd0ca98 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x000000010e6a3923 -[UICalloutBar buttonPressed:] + 414
    6   UIKit                               0x000000010e6a1e47 -[UICalloutBarButton fadeAndSendAction] + 81
    7   Foundation                          0x000000010d416c39 __NSFireDelayedPerform + 402
    8   CoreFoundation                      0x000000010dd17264 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    9   CoreFoundation                      0x000000010dd16e11 __CFRunLoopDoTimer + 1089
    10  CoreFoundation                      0x000000010dcd8821 __CFRunLoopRun + 1937
    11  CoreFoundation                      0x000000010dcd7e08 CFRunLoopRunSpecific + 488
    12  GraphicsServices                    0x000000011158fad2 GSEventRunModal + 161
    13  UIKit                               0x000000010e16430d UIApplicationMain + 171
    14  WebViewCutErrorDemo                 0x000000010d32c86f main + 111
    15  libdyld.dylib                       0x00000001104f292d start + 1
)
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 > 0) {
        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#

时间: 2024-11-15 22:45:42

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

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

这个意思是,__NSDictionaryM  无法将值传到下标索引对象,言简意赅就是数组越界,但是再看看,这是数组吗?不是,所以,遇到这种crash,我这里有两种情况: 1.首先看看你 indexPath.row 用的有没有问题: 2.看看你请求下来的数据类型对不对. 如果还有其他情况,欢迎留言 有的时候,系统并不提示你crash在了哪里,仅仅返回到了main函数,这个时候,点击 show the Breakpoint Navigator,就是工程目录上面那一行工具中的断点符号,然后左下角有个"

静态库调用中“unrecognized selector sent to instance”错误

在开发调用静态库的中,出现 “unrecognized selector sent to instance 0x2b5f90”的错误 -[__NSCFConstantString xmlChar]: unrecognized selector sent to instance 0x2b5f90 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantS

[NSConcreteValue doubleValue]: unrecognized selector sent to instance

今天需求说要给在进入某个页面给某个按钮加上放大效果,心想这还不简单,于是三下五除二的把动画加上提交测试了. 下面是动画的代码 NSTimeInterval time = CACurrentMediaTime(); time = time + 0.5; CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; //设置value CATransform3D

ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0&#39;报错

今天接口由get换成post,我去改进行登录但出现了这个错误,首先出错先看能不能与服务器交互,能不能获得数据,其次,获得的数据是不是你想要的,记住,首先出错要想到是自己的问题,还有就是程序崩了要学会自己解决,打断点找原因,一步步跟,看是哪里出了问题 我这个问题一看就是拿了NSCFNumber类型和NSString类型做了比较,由于不会响应isEqualToString方法而报错,所以只要转换一下就可以了 NSString *factory_id = [NSString stringWithFor

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

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x4b17be0' 错误:NSArray 不能使用 addObject:方法.可能是在程序运行的过程中,NSMutableArray转为了NSArray. 解决方案:核查数组,看看是否在NSArra

iOS开发&mdash;&mdash;异常:[__NSCFNumber length]: unrecognized selector sent to instance

  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance   网上参考的他人案例,与我的情况一模一样,所以直接盗用他的图和文章了. http://www.tuicool.com/articles/EZ3uMb7         这个错误是作者解析pilst文

ios- -[__NSCFType invalidate]: unrecognized selector sent to instance 0x18894a30错误随笔

问题:app点支付按钮,跳到支付宝web页面,程序进入后台,程序卡死,支付完成或取消支付时,程序crash. 报错:-[__NSCFType invalidate]: unrecognized selector sent to instance 0x18894a30,错误原因是对已经销毁的对象,发送了消息,程序访问不到对象. 我集成了保利视频,发生错误的代码 - (void)initPloyVideo { PolyvSettings *polyvSettings = [[PolyvSetting

iOS中的crash防护(一)unrecognized selector sent to instance

专栏开篇: 在开发的过程中,作开为发者我们经常会遇到崩溃,闪退的情况,而且崩溃,闪退的情况有很多种.如果是在开发测试过程中的话,我们可以及时进行分析修复,但是对于我们的KPI还是会一有定的影响的,给导领留下的印象不佳.而且定位crash仍然需要花费很多的时间.如果崩溃,闪退发生在线上,那么对我们公司的产品影响更大,对我们的影响也是大的不行,轻则挨骂,重则扣工资.而且线上crash难以追踪定位,相信大家都深有体会.如果有一种机制,能够将常见的大多数crash给屏掉蔽,不会crash,而且可以发送c

CRASH: -[NSNull length]: unrecognized selector sent to instance错误的处理办法

开发中从后台请求数据,返回如下: 2014-12-05 16:44:52.535 掌麦[6984:613] getDefaultAddress: reuslt == { item =     { data =         { address = "<null>"; area = "<null>"; city = "<null>"; name = ""; phone = 185030513