在iOS 9.x中禁用UITextfield的复制粘贴功能无法正常工作

6
我在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 

请问有人能告诉我我的代码哪里错了吗?

5个回答

12

在你的代码中添加以下方法即可:

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

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

希望这会有所帮助 :)


1
我现在正在点赞,但根据Stackoverflow的指南,询问点赞问题并不好。 - Ketan Parmar
有没有iOS 13和14上不被弃用的等效方法/代码片段?谢谢。 - Rhys Lewis

2

-canPerformAction:withSender: 应该在 UITextField 的子类中实现。看起来您没有继承一个 UITextField,因为您正在分配一个 UITextField。


是的,我没有使用UITextField的子类。请问如果不使用UITextField的子类,能否告诉我? - S P Balu Kommuri

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;
}

希望这有所帮助。

0

enter image description here

 //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];
}

0

Swift 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)
}

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