2011-09-08 67 views
4

我将UIWebView控件添加到我的应用程序中。UIWebView - 创建自定义上下文菜单?

要禁用默认上下文菜单,我实现了webViewDidFinishLoad。

- (void) webViewDidFinishLoad:(UIWebView *)theWebView { 
    NSString *varMySheet = @"var mySheet = document.styleSheet[0];"; 
    NSString *addCSSRule = @"function addCSSRule(selector, newRule) {" 
     "if (mySheet.addRule) {" 
     "mySheet.addRule(selector, newRule);" 
     "} else {" 
     "ruleIndex = mySheet.cssRules.length;" 
     "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex;" 
     "}" 
     "}"; 
    ... 
    NSString *insertRule = @"addCSSRule('body', '-webkit-touch-callout: none;')"; 

    [webView stringByEvaluatingJavaScriptFromString:varMySheet]; 
    [webView stringByEvaluatingJavaScriptFromString:addCSSRule]; 
    [webView stringByEvaluatingJavaScriptFromString:insertRule]; 
    ... 
} 

但是webview的上下文菜单并没有消失。任何人都帮助我。

我也试过

[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"]; 

它没有工作。 谢谢。

+1

您的方法被命名为“webViewDidLoadFinished:',而不是'webViewDidFinishLoad:'。这是问题和/或代码中的错字吗? – Jilouc

+0

不好意思问这个问题,但我认为需要提问。你有没有设置'UIWebView''委托'属性,你确定代码正在执行? – nloko

+0

当然。我添加[webView setDelegate:self]。 – cyberworld

回答

0

你能解释一下为什么你要用这个javascript来做什么? 只要做到以下是不够的吗?

- (void) webViewDidFinishLoad:(UIWebView *) sender { 
    // Disable the defaut actionSheet when doing a long press 
    [webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"]; 
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"]; 
} 
+0

谢谢。我尝试过,但它也不起作用。 – cyberworld

+0

这与我上面的代码具有相同的含义。 – cyberworld

+0

我刚刚注意到,这是不适用于最新的iOS测试版本,而它与iOS3和iOS4一起工作...您使用的是iOS测试版本吗? – Sylverb

0

你只需要继承UIWebView。在您的自定义视图,只需实现方法canPerformAction:withSender这样的:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    return NO; 
} 

那么所有的菜单项就会消失。如果您只想显示一些项目,则应该为指定的项目返回YES。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    BOOL ret = NO; 
    if (action == @selector(copy:)) ret = YES; 
    return ret; 
} 

当您在视图中长按一个单词时,只给出“复制”。