我试过
@implementation UITextField (DisableCopyPaste)
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return NO;
return [super canPerformAction:action withSender:sender];
}
@end
但是它会禁用所有文本字段的复制/粘贴选项,如何禁用特定文本字段的菜单选项。
答案 0 :(得分:13)
我认为这种方法没问题,因为没有制作类别等。我的工作正常。
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
答案 1 :(得分:8)
您应该继承UITextView
并覆盖canPerformAction:withSender
。
应该使用您的子类定义不应提供复制/粘贴的文本字段。
NonCopyPasteField.h:
@interface NonCopyPasteField : UITextField
@end
NonCopyPasteField.m:
@implemetation
(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(copy:) || action == @selector(paste:)) {
return NO;
}
[super canPerformAction:action withSender:sender];
}
@end
更新。 Swift版本:
class NonCopyPasteField: UITextField {
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if (action == #selector(copy(_:)) || action == #selector(paste(_:))) {
return false
}
return super.canPerformAction(action, withSender: sender)
}
}
答案 2 :(得分:2)
为UITextField创建一个子类并覆盖该方法并在任何地方使用它。
@interface CustomTextField: UITextField
@end
@implemetation CustomTextField
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
//Do your stuff
}
@end
答案 3 :(得分:0)
在您的实施中,您必须检查发件人是否是您应该禁用的确切文本字段:
@implementation UITextField (DisableCopyPaste)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if ((UITextField *)sender == yourTextField)
return NO;
return [super canPerformAction:action withSender:self];
}
@end
但是制作一个覆盖方法的类别并不好。如果你创建一个像SpecialTextField
那样继承UITextField
的新类会更好,它会为canPerformAction提供方法return NO
:withSender:并且只将这个类设置为应该有副本的文本字段/粘贴已禁用。