从UIWebView(iOS)中删除粗体,斜体和下划线选项

从UIWebView(iOS)中删除粗体,斜体和下划线选项,第1张

概述我似乎无法从UIWebView中删除Bold,Italic和Underline选项.为什么这不可能? CustomWebView.h: #import <UIKit/UIKit.h>@interface CustomUIWebView : UIWebView@end CustomWebView.m: #import <Foundation/Foundation.h>#import "Cu 我似乎无法从UIWebVIEw中删除Bold,Italic和Underline选项.为什么这不可能?

CustomWebVIEw.h:

#import <UIKit/UIKit.h>@interface CustomUIWebVIEw : UIWebVIEw@end

CustomWebVIEw.m:

#import <Foundation/Foundation.h>#import "CustomUIWebVIEw.h"@implementation CustomUIWebVIEw-(BOol)canPerformAction:(SEL)action withSender:(ID)sender{    return NO;    return [super canPerformAction:action withSender:sender];}@end

解决方法 我已经调查了很多来解决这个问题,最后找到了解决方案.我首先覆盖 – (BOol)canPerformAction:(SEL)动作withSender:包含UIWebVIEw的UIVIEwController中的(ID)发送者足以阻止显示文本样式选项.但不幸的是,它并不像看起来那么容易.

这样做的主要原因是我们必须覆盖主要第一响应者的canPerformAction.从控制器调用[[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]会通知我们UIWebbrowserVIEw是实际的主要第一响应者.我们想要子类化UIWebbrowserVIEw,但由于它是私有类,我们可能会在审核过程中拒绝Apple拒绝我们的应用程序.来自@Shayan RC的This answer建议执行一个方法调整以允许重写此方法而无需子类化UIWebbrowserVIEw(从而防止App Store拒绝).

解决方案

我们的想法是添加一个替代canPerformAction的新方法.我创建了一个包含我们想要保留在菜单中的所有方法签名的数组.要删除样式选项,我们只需要将@“_ showtextStyleOptions:”添加到此数组中.添加要显示的所有其他方法签名(我已添加了签名的NSLog,以便您可以选择所需的方法签名).

- (BOol) mightPerformAction:(SEL)action withSender:(ID)sender {    NSLog(@"action : %@",NsstringFromSelector(action));    NSArray<Nsstring*> *selectorsToKeep = @[@"cut:",@"copy:",@"select:",@"selectAll:",@"_lookup:"]; //add in this array every action you want to keep    if ([selectorsToKeep containsObject:NsstringFromSelector(action)]) {        return YES;    }    return NO;}

现在我们可以使用以下方法(来自@Shayan RC的答案)执行方法调配来调用前一个方法而不是canPerformAction.这将需要添加#import< objc / runtime.h>.

- (voID) replaceUIWebbrowserVIEw: (UIVIEw *)vIEw {    //Iterate through subvIEws recursively looking for UIWebbrowserVIEw    for (UIVIEw *sub in vIEw.subvIEws) {        [self replaceUIWebbrowserVIEw:sub];        if ([NsstringFromClass([sub class]) isEqualToString:@"UIWebbrowserVIEw"]) {            Class class = sub.class;            SEL originalSelector = @selector(canPerformAction:withSender:);            SEL swizzledSelector = @selector(mightPerformAction:withSender:);            Method originalMethod = class_getInstanceMethod(class,originalSelector);            Method swizzledMethod = class_getInstanceMethod(self.class,swizzledSelector);            //add the method mightPerformAction:withSender: to UIWebbrowserVIEw            BOol dIDAddMethod =            class_addMethod(class,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEnCoding(swizzledMethod));            //replace canPerformAction:withSender: with mightPerformAction:withSender:            if (dIDAddMethod) {                class_replaceMethod(class,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEnCoding(originalMethod));            } else {                method_exchangeImplementations(originalMethod,swizzledMethod);            }        }    }}

最后,在vIEwDIDLoad中调用prevIoUs方法,如下所示:[self replaceUIWebbrowserVIEw:_webVIEw].

方法调整似乎很难,但它允许您将代码保存在视图控制器中.如果您在实施以前的代码时遇到任何困难,请告诉我.

注意:使用WKWebVIEw比使用UIWebVIEw更容易实现此行为,并且不推荐使用UIWebVIEw,您应该考虑切换到WKWebVIEw.

总结

以上是内存溢出为你收集整理的从UIWebView(iOS)中删除粗体,斜体下划线选项全部内容,希望文章能够帮你解决从UIWebView(iOS)中删除粗体,斜体和下划线选项所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1104801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存