很显然曾经有一个easy way来防止“更多的.”添加多个自定义菜单项时,标签将出现在UIMenuController中。您只需删除所有的系统菜单项。甚至有一个workaround here,因为仍然有复制工作。您只需使用不同的选择器实现一个自定义复制命令,然后重写canPerformAction:withSender:以不显示系统副本:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:))
return NO;
else
// logic to show or hide other things
}不幸的是,此方法不再起作用(至少在UIWebView子类中是如此)。对于每个系统菜单项调用canPerformAction:withSender:,所以结果总是显示系统复制菜单项。这意味着,如果您有多个自定义菜单项,它们总是隐藏在“多.”后面。
那么,是否有一种方法可以真正删除系统的复制项,或者其他方法来防止菜单项隐藏在“更多的.”后面?
更新
这是当我重写canPerformAction:withSender:注意该方法从未被调用为"copy:“操作时得到的输出:
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
can perform action customCopy: with sender <UIMenuController: 0x7227d30>.
can perform action custom1: with sender <UIMenuController: 0x7227d30>.
cannot perform action custom2: with sender <UIMenuController: 0x7227d30>.
can perform action custom3: with sender <UIMenuController: 0x7227d30>.
can perform action custom4: with sender <UIMenuController: 0x7227d30>.
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.发布于 2011-08-07 11:09:28
你联系到的技术似乎仍然有效。我用这些方法实现了一个UIWebView子类,只出现了A和B项。
+ (void)initialize
{
UIMenuItem *itemA = [[UIMenuItem alloc] initWithTitle:@"A" action:@selector(a:)];
UIMenuItem *itemB = [[UIMenuItem alloc] initWithTitle:@"B" action:@selector(b:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:itemA, itemB, nil]];
[itemA release];
[itemB release];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
BOOL can = [super canPerformAction:action withSender:sender];
if (action == @selector(a:) || action == @selector(b:))
{
can = YES;
}
if (action == @selector(copy:))
{
can = NO;
}
NSLog(@"%@ perform action %@ with sender %@.", can ? @"can" : @"cannot", NSStringFromSelector(action), sender);
return can;
}发布于 2012-06-13 07:52:27
对于ios >= 5.1 canPerformAction:(SEL)action withSender:(Id)发件人不再工作了。
如果您只需要禁用粘贴操作就行了,下面是一个方法:
将UITextFieldDelegate添加到视图控制器中,并实现如下方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if(textField == txtEmailRe)
return ((string.length) > 1 ? NO : YES);
}这意味着,如果用户为每个操作输入多个字符(这意味着用户可能正在粘贴某些内容)。在textfield中不要接受它。
这是一个很好的做法,强制用户输入文本字段,如电子邮件和
发布于 2011-10-30 11:35:58
的答案是正确的。实现UIWebView的子类工作得很好。这个example对于UITextView来说是可以的。对于UIWebView,创建一个自定义子类如下所示:
//
// MyUIWebView.h
//
#import <UIKit/UIKit.h>
@interface MyUIWebView : UIWebView
@end和:
//
// MyUIWebView.m
//
#import "MyUIWebView.h"
@implementation MyUIWebView
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:))
return NO;
else
// logic to show or hide other things
}
@end然后,不要实例化UIWebView,而是使用MyUIWebView。
更新
如果希望禁用“复制”但保留“定义”(和“转换”),这是有用的,这是如何做到这一点;将上面的canPerformAction:withSender替换为:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(defineSelection:))
{
return YES;
}
else if (action == @selector(translateSelection:))
{
return YES;
}
else if (action == @selector(copy:))
{
return NO;
}
return [super canPerformAction:action withSender:sender];
}https://stackoverflow.com/questions/6614465
复制相似问题