我正在开发一个iPhone应用程序并使用UIWebViews。我计划在UiWebView(复制,全选,剪切等)中突出显示字符串时自定义弹出的UIMenuItems。我尝试删除那些menuItems但我无法删除COPY菜单项。
我需要你的帮助。
谢谢, ZaldzBugz
答案 0 :(得分:2)
你将不得不做一些劫持。我甚至不知道是否有可能。看起来它可能会响应一个名为UILongPressGestureRecognizer的手势事件。
您需要找出添加了手势的视图。像这样的东西。
NSArray *gestures = myWebView.gestureRecognizers;
for(int i=0;i<[gestures count];i++){
UIGestureRecognizer g = [gestures objectAtIndex:i];
if([g isKindOfClass:UILongPressGestureRecognizer.Class]){
[myWebView removeGestureRecognizer:g];
break;
}
}
但我不认为这个手势直接在UIWebview上。它位于其中一个子视图中。
所以它可能在这个子视图中
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
如果不是那个那么它可能在最顶层的视图上,这是我怀疑的。它是一个未记录的View类型,但是如果你将它视为我们调用的方法的UIView,它可能是安全的。另外,因为你把它视为一个UIView,据我所知,它并不违反规则。
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
UIView *realWebView = [[sview subviews] objectAtIndex:10];
我没有编写代码片段(未经测试)以尝试从所有视图中删除手势的原因是因为重要的是你知道从哪个视图中删除它。
删除后,您需要编写自己的UILongPressGestureRecognizer,然后将新的UILongPressGestureRecognizer添加到相应的视图(从中移除的视图)。
您已经失去了复制选择等所有功能......但现在您可以实现自己的功能了。
如果您想要一些旧功能,我想我知道如何取回它,但我不能保证这是允许的或安全的。
在删除手势之前,您需要将方法覆盖为UIView。您应该能够在当前的工作类文件中(位于文件顶部)
@implementation UIView (extended)
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n",
[NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
@end
我无法承诺任何事情,但这应记录您视图中调用的每个方法的名称。
运行您的应用并执行复制,粘贴,选择,选择所有方法。您的日志应显示按下按钮时调用的方法。按下按钮时可能会显示几种方法,您可能只想要第一种方法。
现在,当您创建一个menuItem时,您知道要分配给它的选择器。
这只是猜测。希望它有所帮助。
答案 1 :(得分:1)
我在this answer中使用了类似问题的技术,它可以用于删除“复制”菜单项。也就是说,在他们的示例中覆盖UIWebView而不是UITextView。还写了一个canPerformAction:withSender:在视图控制器中为我的自定义选择器返回YES,而对于copy:选择器返回NO,如果选择器不是那些,则返回超级实现的值。请记住在xib中设置自定义UIWebView子类名称。