如何在iPhone应用程序的UIWebView中启用“全选”?

问题描述 投票:0回答:2
我正在编写一个嵌入 UIWebView 的 iPhone 应用程序。有各种类似 safari 的功能,如导航等。我正在寻找的任务之一是当用户在网络视图上选择一段文本时呈现“全选”选项。目前,我只看到“复制”选项。有没有一种简单的方法来启用“全选”菜单项?我当然尝试过向共享菜单控制器添加一个菜单项,但这不一定实现原始的 safari“全选”功能。任何帮助和指示都会非常有用。

提前致谢。

ios iphone uiwebview ios4 uiwebviewdelegate
2个回答
2
投票
简短的回答是否定的,这是不可能的。

您可以通过子类化 UIWebView 并覆盖来做到这一点(无需自己向菜单控制器添加任何内容):

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender

并检查选择器是否为

selectAll:



像这样:

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(selectAll:)) { return YES; } else { return [super canPerformAction:action withSender:sender]; } }

这将在保留菜单上显示全选选项。然而,这不是 webView 的默认行为,虽然当您按全选时应用程序不会崩溃,但按它不会执行任何操作。

您甚至无法创建 selectAll 方法,然后选择 webview 中的所有内容,因为 javascript 方法

.select()

 不适用于 Mobile Safari/UIWebView。


0
投票
您可以在运行时使用以下

selectAll

 类别为不可编辑的 
webView
 实现 
UIWebView
 行为(相当于 Apple Mail.app 中的行为)。

主要思想是使用提示,

UIWebBrowserView

UIWebView
的子视图,是
UIWebDocumentView
的子类,它符合
UITextInputPrivate
协议,相当于公共
UITextInput
协议

// UIWebView+SelectAll.h // Created by Alexey Matveev on 28.03.15. // Copyright (c) 2015 Alexey Matveev. All rights reserved. @interface UIWebView (SelectAll) + (void)setEnableSelectAll:(BOOL)enabled; @end #import "UIWebView+SelectAll.h" #import <objc/runtime.h> /* UIWebDocumentView is the superclass for UIWebBrowserView. UIWebDocumentView conforms UITextInputPrivate protocol which is identival to UITextInput */ static IMP canPerformActionWithSenderImp; @implementation UIWebView (SelectAll) @dynamic enableSelectAll; - (BOOL)customCanPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(selectAll:)) { return ! self.isSelectedAll; } else { BOOL(*imp)(id, SEL, SEL, id) = (BOOL(*)(id, SEL, SEL, id))canPerformActionWithSenderImp; return imp(self, @selector(canPerformAction:withSender:), action, sender); } } - (void)selectAll:(id)sender { [self.browserView selectAll:sender]; } - (UIView<UITextInput> *)browserView { UIView *browserView; for (UIView *subview in self.scrollView.subviews) { if ([subview isKindOfClass:NSClassFromString(@"UIWebBrowserView")]) { browserView = subview; break; } } return (UIView<UITextInput> *)browserView; } - (BOOL)isSelectedAll { UITextRange *currentRange = self.browserView.selectedTextRange; if ([self.browserView comparePosition:currentRange.start toPosition:self.browserView.beginningOfDocument] == NSOrderedSame) { if ([self.browserView comparePosition:currentRange.end toPosition:self.browserView.endOfDocument] == NSOrderedSame) { return YES; } } return NO; } + (void)setEnableSelectAll:(BOOL)enabled { SEL canPerformActionSelector = @selector(canPerformAction:withSender:); if (!canPerformActionWithSenderImp) { canPerformActionWithSenderImp = [self instanceMethodForSelector:canPerformActionSelector]; } IMP newCanPerformActionWithSenderImp = enabled ? [self instanceMethodForSelector:@selector(customCanPerformAction:withSender:)] : canPerformActionWithSenderImp; Method canPerformActionMethod = class_getInstanceMethod([self class], canPerformActionSelector); class_replaceMethod([self class], canPerformActionSelector, newCanPerformActionWithSenderImp, method_getTypeEncoding(canPerformActionMethod)); } @end

当然,你可以使用全局方法swizzling for

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;

以标准方式,但它将不可逆转地影响项目中的所有 webView。

© www.soinside.com 2019 - 2024. All rights reserved.