禁用复制,在 UITextfield 中粘贴在 iOS 9.x 中不起作用

Posted

技术标签:

【中文标题】禁用复制,在 UITextfield 中粘贴在 iOS 9.x 中不起作用【英文标题】:Disable copy, paste in UITextfield is not working in iOS 9.x 【发布时间】:2016-06-03 06:02:34 【问题描述】:

我在一个类 BBCustomUtility.h,.m 类文件中创建了一个文本字段,然后

+(UITextField*)createTextField: (CGRect)rect image:(NSString*)imageName tag:(int)tag secureText:(BOOL)entry placeh:(NSString*)placeholder

    UITextField *transactionField = [ [ UITextField alloc ] initWithFrame: rect ];
    transactionField.background = [UIImage imageNamed:imageName];
    transactionField.adjustsFontSizeToFitWidth = YES;
    transactionField.textColor = [UIColor blackColor];
    transactionField.font = [UIFont systemFontOfSize:17.0];
    transactionField.placeholder = placeholder;
    transactionField.backgroundColor = [UIColor clearColor];
    transactionField.borderStyle = UITextBorderStyleNone;
    transactionField.autocorrectionType = UITextAutocorrectionTypeNo; 
    transactionField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
    transactionField.textAlignment = UITextAlignmentCenter;
    transactionField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    transactionField.keyboardType = UIKeyboardTypeDefault;
    transactionField.returnKeyType = UIReturnKeyDone;
    transactionField.tag = tag;
    transactionField.delegate = self;
    transactionField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    transactionField.text = @"";
    [ transactionField setEnabled: YES ];
    transactionField.secureTextEntry = entry;
    return transactionField ;

从普通类导入并在class1.m中使用

mPasswordField1 = [BBCustomUtility createTextField:CGRectMake(IS_WIDTH_DEVICE/2-120, 140, 50, 50) image:@"txtField_bg_50.png" tag:1 secureText:YES placeh:[shareObj.mLabelDictionary valueForKey:@""]];
    mPasswordField1.keyboardType = UIKeyboardTypeNumberPad;
    mPasswordField1.clearButtonMode = UITextFieldViewModeNever;
    mPasswordField1.delegate = self;
    [self.view addSubview:mPasswordField1];

尝试在以下方法中禁用文本字段上的复制粘贴选项,这些方法对我不起作用

1)
    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
    
        // Returning 'NO' here disables all actions on textfield
        return NO;
       // not working still showing the paste option on textfield

2)

 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
    
        if (action == @selector(copy:) || action == @selector(paste:)) 
            return NO;
        
       return [super canPerformAction:action withSender:sender];
      // this is also not working still showing the paste option 

3)

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    

        if ([mPasswordField1 respondsToSelector:@selector(inputAssistantItem)])
        
            UITextInputAssistantItem *inputAssistantItem = [mPasswordField1 inputAssistantItem];
            inputAssistantItem.leadingBarButtonGroups = @[];
            inputAssistantItem.trailingBarButtonGroups = @[];
        
     // this also not working 

谁能告诉我我在代码中犯了什么错误。

【问题讨论】:

【参考方案1】:

在你的代码中添加下面的方法,就是这样,

 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
[[NSOperationQueue mainQueue] addOperationWithBlock:^
    [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
];
return [super canPerformAction:action withSender:sender];

它将禁用所有类型的编辑。

希望这会有所帮助:)

【讨论】:

我现在正在投票,但按照 stacdkoverflow 的指南提出投票问题并不好。 是否有等效的方法/代码 sn-p 在 ios 13 和 14 上不被弃用?谢谢【参考方案2】:

如果您只想将其应用于一个特殊的文本字段,例如密码:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
    if([self.textFieldPassword isFirstResponder])
        [[NSOperationQueue mainQueue] addOperationWithBlock:^
            [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
        ];
    
    return [super canPerformAction:action withSender:sender];

另一种选择是直接避免选择实现 UITextFieldDelegate 的 Textfield 并在其方法中进行:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
    textField.userInteractionEnabled = NO;
    return YES;


- (void)textFieldDidEndEditing:(UITextField *)textField 
    textField.userInteractionEnabled = YES;

希望对你有帮助。

【讨论】:

【参考方案3】:

-canPerformAction:withSender: 应该在 UITextField 的子类中。它看起来不像是子类,因为您正在分配 UITextField。

【讨论】:

是的,我没有使用 UITextField 的子类。你能告诉我是否没有 uitextfield 的子类【参考方案4】:

 //This code has side effects in the UISearchbar (white field is no more disappearing):
 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
 [[NSOperationQueue mainQueue] addOperationWithBlock:^
[[UIMenuController sharedMenuController] setMenuVisible:NO  animated:NO];
];
return [super canPerformAction:action withSender:sender];

【讨论】:

【参考方案5】:

斯威夫特 5

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool 
    OperationQueue.main.addOperation 
        UIMenuController.shared.setMenuVisible(false, animated: false)
    
    return super.canPerformAction(action, withSender: sender)

【讨论】:

以上是关于禁用复制,在 UITextfield 中粘贴在 iOS 9.x 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextView 中禁用光标和复制/粘贴(swift)

在 UITextField 中禁用“定义”

在 iOS5 的 uitextfield 中禁用粘贴

如何快速禁用 SkyFloatingLabelTextField 中的复制粘贴功能?

如何禁用 UITextField 的选择?

如何在 Swift iOS 中禁用 UITextField 双击或长按? [复制]