2011-09-08 74 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; 
} 

當您在視圖中長按一個單詞時,只給出「複製」。