截取复制,粘贴,在UIWebView中定义popover

当我们在UIWebView中突出显示文本时,通常会出现复制,粘贴,定义等等。 我如何拦截这个,所以当我select复制时,我打电话给其他方法/做别的事情。 这可能吗?

你可以简单地覆盖-copy:

- (void)copy:(id)sender { // Do something else here return [super copy:sender]; } 

编辑回答您的评论。

定义是有点棘手,因为它是私人的。 但是,你可以实现你自己的方法。 用你想要的项目设置UIMenuController。

 UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"Copy" action:@selector(myCopy:)]; UIMenuItem *defineItem = [[UIMenuItem alloc] initWithTitle:@"Define" action:@selector(myDefine:)]; [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:defineItem, copyItem, nil]]; [defineItem release]; [copyItem release]; 

然后你实现这些方法。

至于定义,它的方式更复杂..首先,你需要检查是否UIReferenceLibraryController有一个定义,通过重写-canPerformAction:withSender:

 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(myDefine:)) { // Make sure we are on iOS5.x if (NSClassFromString(@"UIReferenceLibraryViewController")) { return [UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:[webView selectedText]]; } } // Implement other custom actions here return NO; } 

-selectedText在这里是UIWebView的一个类别:

 - (NSString *)selectedText { return [self stringByEvaluatingJavaScriptFromString:@"window.getSelection().toString()"]; } 

那么你需要实现myDefine:

 - (void)myDefine:(UIMenuController *)menuController { CGRect selectedWordFrame = [webView rectForSelectedText]; UIReferenceLibraryViewController *dict = [[UIReferenceLibraryViewController alloc] initWithTerm:[webView selectedText]]; UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:dict]; [popover presentPopoverFromRect:selectedWordFrame inView:webView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; [popover setDelegate:self]; [dict release]; } - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { [popoverController release]; } 

编辑以回复您的评论

-rectForSelectedText是UIWebView上的另一个自定义类别。

 - (CGRect)rectForSelectedText { return CGRectFromString([self stringByEvaluatingJavaScriptFromString:@"getRectForSelectedWord()"]); } 

它所做的是调用一个JavaScript,返回一个可以使用CGRectFromString()转换的string,它看起来像这样:

 function getRectForSelectedWord() { var selection = window.getSelection(); var range = selection.getRangeAt(0); var rect = range.getBoundingClientRect(); return "{{" + rect.left + "," + rect.top + "}, {" + rect.width + "," + rect.height + "}}"; } 

检查此页面以了解如何将JavaScript注入到UIWebView中。