禁用复制,在 UITextfield 中粘贴在 iOS 9.x 中不起作用
Disable copy, paste in UITextfield is not working in iOS 9.x
我在一个 class BBCustomUtility.h,.m class 文件中创建了一个文本字段,然后
+(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 ;
}
从通用 class 导入并在 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
谁能告诉我我在代码中犯了什么错误。
-canPerformAction:withSender: 应该在 UITextField 的子类中。它看起来不像你的子类,因为你正在分配一个 UITextField。
在您的代码中添加以下方法即可,
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
它将禁用所有类型的编辑。
希望这会有所帮助:)
//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];
}
如果您只想将其应用于一个特殊的文本字段,例如密码:
- (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;
}
希望对您有所帮助。
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)
}
我在一个 class BBCustomUtility.h,.m class 文件中创建了一个文本字段,然后
+(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 ;
}
从通用 class 导入并在 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
谁能告诉我我在代码中犯了什么错误。
-canPerformAction:withSender: 应该在 UITextField 的子类中。它看起来不像你的子类,因为你正在分配一个 UITextField。
在您的代码中添加以下方法即可,
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
它将禁用所有类型的编辑。
希望这会有所帮助:)
//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];
}
如果您只想将其应用于一个特殊的文本字段,例如密码:
- (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;
}
希望对您有所帮助。
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)
}