在iOS7中如何禁用UITextfield的复制/粘贴选项

10
我尝试过
@implementation UITextField (DisableCopyPaste)

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{

return NO;
return [super canPerformAction:action withSender:sender];
 }

@end

但它禁用了所有文本框的复制/粘贴选项,如何禁用特定文本框的菜单选项。


1
你是否在使用UITextField的类别?如果是的话,如果你将该类别添加到你的视图控制器中,那么在该视图控制器中创建的所有文本字段都不会有复制粘贴选项。 - jailani
是的,我明白,但其他视图控制器中的文本字段也没有那个选项。 - SMS
所以你想在同一个视图控制器中禁用特定文本字段的复制粘贴选项,对吗? - jailani
如果您在您的VC中导入该文本字段类别,则在VC中创建的所有文本字段都不具备复制粘贴选项。 - jailani
4个回答

13

我认为这种方法可以,因为不需要制作类别等等。对我来说很有效。

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
    }];
    return [super canPerformAction:action withSender:sender];

9

您应该创建一个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)
  }
}

@JayprakashDubey 我已经更新了使用 Swift 代码的答案。 - Ilia

3
创建一个 UITextField 的子类并重写方法,然后可以在任何需要的地方使用它。
@interface CustomTextField: UITextField
@end

@implemetation CustomTextField
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    //Do your stuff
}
@end

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 ,并且始终具有方法 return NO 用于 canPerformAction:withSender:。将此类仅设置为应禁用复制/粘贴的文本字段。


2
在类别中覆盖方法是一个可怕的想法。推荐这样做是另一种罪恶。 - holex
我不建议这样做,如果你读完整个答案,你会注意到的。答案的第一部分是指出如何检查应该禁用复制/粘贴的确切文本字段,就像@SMS所问的那样! - o15a3d4l11s2
即使您不推荐它,为什么您认为其他人会使用它呢?我猜这个可怕的建议无论如何都应该被踩。 - holex
3
如果您已经阅读了原始问题,您应该注意到这是@SMS开始提出问题的方式,所以我只是想指引他如何检查精确文本字段。我不明白为什么您要花费很多精力只是为了给我点踩而不是回答更有价值的问题。 - o15a3d4l11s2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接