UIWebView:禁用富文本编辑器的复制/剪切选项

时间:2013-08-15 17:45:49

标签: iphone ios ipad uiwebview rich-text-editor

我有一个带有contentEditable div的UIWebView,以便实现某种富文本编辑器。我需要修剪副本和在用户选择任何文本片段后,在Web视图中显示的UIMenuController中剪切选项。

网络上似乎有很多解决方案,但由于某些原因,不适用于我的方案。

我已经将UIWebView子类化并实现了canPerformAction:(SEL)action withSender:以删除副本和剪切,但是一旦用户选择“选择”或“全选”,就会出现一个新菜单,显然,Web视图会执行不拦截此操作,并且未调用canPerform方法。

enter image description here

有没有办法修剪这种情况的行动?

1 个答案:

答案 0 :(得分:0)

我会根据您的情况调整another answer of mine

canPerformAction:实际上是在内部UIWebDocumentView而不是UIWebView上调用的,而您通常无法将其子类化。有了一些运行时魔术,它是可能的。

我们创建一个有一个方法的类:

@interface _SwizzleHelper : UIView @end

@implementation _SwizzleHelper

-(BOOL)canPerformAction:(SEL)action
{
    //Your logic here
    return NO;
}

@end

一旦有了想要控制其动作的Web视图,就会迭代其滚动视图的子视图并获取UIWebDocumentView类。然后我们动态地将上面创建的类的超类作为子视图的类(UIWebDocumentView - 但我们不能预先说明这是私有API),并将子视图的类替换为我们的类。

#import "objc/runtime.h"    

-(void)__subclassDocumentView
{
    UIView* subview;

    for (UIView* view in self.scrollView.subviews) {
        if([[view.class description] hasPrefix:@"UIWeb"])
            subview = view;
    }

    if(subview == nil) return; //Should not stop here

    NSString* name = [NSString stringWithFormat:@"%@_SwizzleHelper", subview.class.superclass];
    Class newClass = NSClassFromString(name);

    if(newClass == nil)
    {
        newClass = objc_allocateClassPair(subview.class, [name cStringUsingEncoding:NSASCIIStringEncoding], 0);
        if(!newClass) return;

        Method method = class_getInstanceMethod([_SwizzleHelper class], @selector(canPerformAction:));
        class_addMethod(newClass, @selector(canPerformAction:), method_getImplementation(method), method_getTypeEncoding(method));

        objc_registerClassPair(newClass);
    }

    object_setClass(subview, newClass);
}