我有一个UIWebView,它可以加载HTML字符串,并且可以使用Javascript添加内容。
有没有办法知道什么时候(文字或图像)粘贴在网页视图中。
NSString *path = [[NSBundle mainBundle] pathForResource:@"htmlString" ofType:@"txt"];
NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[self.ibWebView loadHTMLString:htmlString baseURL:nil];
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *jsToEncloseInEditableContainer = [NSString stringWithFormat:@"function contentedited(e){window.location='mpscontentedited://' + e.keyCode;};(function() {var body = document.body;var contentContainer = document.createElement('div');contentContainer.id = 'content';contentContainer.setAttribute('contenteditable','true');contentContainer.style.fontFamily=' Helvetica';contentContainer.style.marginTop=\"15px\";contentContainer.onkeydown = contentedited;contentContainer.onpaste=contentedited;var node;while(node=body.firstChild) {contentContainer.appendChild(node);}body.appendChild(contentContainer);%@body=undefined;delete body;contentContainer=undefined;delete contentContainer;node=undefined;delete node;})();", @"contentContainer.focus();"];
[self.ibWebView stringByEvaluatingJavaScriptFromString:jsToEncloseInEditableContainer];
}
我尝试重写UIResponder的paste:方法,但它永远不会被调用。
- (void)paste:(id)sender
{
NSLog(@"paste not called");
}
我还尝试创建自定义菜单按钮
UIMenuController *menu = [UIMenuController sharedMenuController];
UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"Paste Custom" action:@selector(pasteCustom:)];
[menu setMenuItems:@[item]];
[menu setMenuVisible:YES];
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(pasteCustom:))
{
return YES;
}
return [super canPerformAction:action withSender:sender];
}
- (void)pasteCustom:(id)sender
{
NSLog(@"paste custom");
[super paste:sender]; // --> calling this causes a crash (unrecognized selector sent to instance)
}
我做错了什么?
我想知道什么时候粘贴了某些内容,或者我想要一个与默认粘贴按钮类似的自定义菜单按钮。
提前致谢。
答案 0 :(得分:3)
施法不是魔术。
我再说一遍: 施放不是魔术!
它不会更改对象的运行时类型。如果它没有以UIWebView
的形式回复选择器,则它也不会以UIMenuItem
作为响应。您必须使用JavaScript检测事件并将JavaScript函数桥接到Objective-C。使用onpaste
JavaScript事件处理程序,然后执行类似here所述的内容:
<!-- snippet from your HTML string -->
<script type="text/javascript">
function call_objc_paste(text)
{
window.location.href = "fakescheme://" + text;
}
</script>
<input type="text" onpaste="call_objc_paste(this.value);" />
// Objective-C code:
webView.delegate = self;
[webView loadHTMLString:htmlStr baseURL:nil];
- (BOOL) webView:(UIWebView *)wv
shouldStartLoadWithRequest:(NSURLRequest *)rq
navigationType:(UIWebViewNavigationType)navT
{
NSString *rqStr = rq.URL.absoluteString;
NSString *scheme = @"fakescheme://";
if ([rqStr hasPrefix:scheme]) {
NSString *pastedText = [rqStr substringFromIndex:scheme.length];
// potentially do somethin with pastedText, then
return NO;
}
// it's not our fake URL scheme, just normal navigation
return YES;
}
答案 1 :(得分:0)
为了后代而重新提出这个问题:
在这里查看我的答案:Manipulate paste content in WKWebView该解决方案使用Swizzling方法,也可以用于这种情况。