ios 如何以编程方式从 UITextField 禁用复制粘贴选项
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6701019/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to disable copy paste option from UITextField programmatically
提问by C.Johns
I am making a registration alertview that has a UITextField in it where the user can enter their registration number. everything is pretty much their, however I would like to remove the copy paste function from the textfield programmatically since their is no InterfaceBuilder version of the textfield I have no idea how to do this..
我正在制作一个注册警报视图,其中有一个 UITextField,用户可以在其中输入他们的注册号。一切都是他们的,但是我想以编程方式从文本字段中删除复制粘贴功能,因为它们不是文本字段的 InterfaceBuilder 版本我不知道如何执行此操作..
here Is my UIalertview thus far...
这是我的 UIalertview 到目前为止...
- (void)pleaseRegisterDevice {
UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Please Register Device!" message:@"this gets covered" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
regTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
[regTextField setBackgroundColor:[UIColor whiteColor]];
regTextField.textAlignment = UITextAlignmentCenter;
[myAlertView addSubview:regTextField];
[myAlertView show];
[myAlertView release];
}
回答by PengOne
This post has many nice solutions: How disable Copy, Cut, Select, Select All in UITextView
这篇文章有很多不错的解决方案:如何在 UITextView 中禁用复制、剪切、选择、全选
My favourite is to override canPerformAction:withSender:
:
我最喜欢的是覆盖canPerformAction:withSender:
:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
return NO;
return [super canPerformAction:action withSender:sender];
}
回答by gujci
Storyboard users may want to look at this solution, as long as you are ok with subclassing.
只要您对子类化没问题,故事板用户可能想要查看此解决方案。
I don't think that there is an easy way to achieve this through extensions or protocols.
我认为没有一种简单的方法可以通过扩展或协议来实现这一点。
Swift 3.1
斯威夫特 3.1
import UIKit
@IBDesignable
class CustomTextField: UITextField {
@IBInspectable var isPasteEnabled: Bool = true
@IBInspectable var isSelectEnabled: Bool = true
@IBInspectable var isSelectAllEnabled: Bool = true
@IBInspectable var isCopyEnabled: Bool = true
@IBInspectable var isCutEnabled: Bool = true
@IBInspectable var isDeleteEnabled: Bool = true
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
switch action {
case #selector(UIResponderStandardEditActions.paste(_:)) where !isPasteEnabled,
#selector(UIResponderStandardEditActions.select(_:)) where !isSelectEnabled,
#selector(UIResponderStandardEditActions.selectAll(_:)) where !isSelectAllEnabled,
#selector(UIResponderStandardEditActions.copy(_:)) where !isCopyEnabled,
#selector(UIResponderStandardEditActions.cut(_:)) where !isCutEnabled,
#selector(UIResponderStandardEditActions.delete(_:)) where !isDeleteEnabled:
return false
default:
//return true : this is not correct
return super.canPerformAction(action, withSender: sender)
}
}
}
回答by serge-k
For iOS8.0+, Xcode 6.0.1, ARC enabled
对于 iOS8.0+,Xcode 6.0.1,启用 ARC
Hoping to save a beginner, like myself, some time implementing this...
希望能拯救像我这样的初学者,花点时间实现这个......
To implement disabling copy/paste/cut/etc. you must subclass UITextField and override...
实现禁用复制/粘贴/剪切/等。您必须继承 UITextField 并覆盖...
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
To do this...
去做这个...
Create a new class that is a subclass of UITextField (i.e. a new .h and .m files to be included within your app folder). So File->New->"Cocoa Touch Class"->Next->"PasteOnlyUITextField" (for example), subclass of "UITextField"->Next->Create.
创建一个新类,它是 UITextField 的子类(即要包含在您的应用程序文件夹中的新 .h 和 .m 文件)。所以File->New->"Cocoa Touch Class"->Next->"PasteOnlyUITextField"(例如),"UITextField"的子类->Next->Create。
Once the .h and .m files are created for our new subclass of UITextField called "PasteOnlyUITextField"...
一旦为我们名为“PasteOnlyUITextField”的 UITextField 新子类创建了 .h 和 .m 文件...
PasteOnlyUITextField.h
PasteOnlyUITextField.h
#import <UIKit/UIKit.h>
@interface PasteOnlyUITextField : UITextField
@end
PasteOnlyUITextField.m
PasteOnlyUITextField.m
#import "PasteOnlyUITextField.h"
@implementation PasteOnlyUITextField
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
{
return true;
}
return false;
}
@end
Now make sure you import PasteOnlyUITextField.h where you are going to use it, e.g. YourUIViewController.h file...
现在确保你导入 PasteOnlyUITextField.h 在你要使用它的地方,例如 YourUIViewController.h 文件...
#import "PasteOnlyUITextField.h"
Now you must use the subclass, either progrommatically or with identity inspector
现在您必须以编程方式或与身份检查器一起使用子类
PasteOnlyUITextField *pasteOnlyUITextField = [[PasteOnlyUITextField alloc] init...];
or...
或者...
Select the UITextField and go to the identity inspector, select its class.
选择 UITextField 并转到身份检查器,选择它的类。
You can change the logic associated with the menu options as you see fit...
您可以根据需要更改与菜单选项关联的逻辑...
Hope this helps! Thanks to all the original contributors.
希望这可以帮助!感谢所有原始贡献者。
回答by dtissera
I have found a way with swift using extension and associatedObject without subclassing. I use a property readonly to disable paste/cut but this sample can be adapted.
我找到了一种快速使用扩展和关联对象而无需子类化的方法。我使用属性 readonly 来禁用粘贴/剪切,但可以修改此示例。
Swift 3updated as of 27/11/2016
Swift 3更新至 27/11/2016
var key: Void?
class UITextFieldAdditions: NSObject {
var readonly: Bool = false
}
extension UITextField {
var readonly: Bool {
get {
return self.getAdditions().readonly
} set {
self.getAdditions().readonly = newValue
}
}
private func getAdditions() -> UITextFieldAdditions {
var additions = objc_getAssociatedObject(self, &key) as? UITextFieldAdditions
if additions == nil {
additions = UITextFieldAdditions()
objc_setAssociatedObject(self, &key, additions!, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
return additions!
}
open override func target(forAction action: Selector, withSender sender: Any?) -> Any? {
if ((action == #selector(UIResponderStandardEditActions.paste(_:)) || (action == #selector(UIResponderStandardEditActions.cut(_:)))) && self.readonly) {
return nil
}
return super.target(forAction: action, withSender: sender)
}
}
Other Swift (2.2)
其他斯威夫特 (2.2)
import UIKit
var key: Void?
class UITextFieldAdditions: NSObject {
var readonly: Bool = false
}
extension UITextField {
var readonly: Bool {
get {
return self.getAdditions().readonly
}
set {
self.getAdditions().readonly = newValue
}
}
private func getAdditions() -> UITextFieldAdditions {
var additions = objc_getAssociatedObject(self, &key) as? UITextFieldAdditions
if additions == nil {
additions = UITextFieldAdditions()
objc_setAssociatedObject(self, &key, additions!, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
return additions!
}
public override func targetForAction(action: Selector, withSender sender: AnyObject?) -> AnyObject? {
if ((action == Selector("paste:") || (action == Selector("cut:"))) && self.readonly) {
return nil
}
return super.targetForAction(action, withSender: sender)
}
}
回答by Himani Sharma
Implement this Method in ViewController.m This Method will help you to disable Options on UITextField
.
在 ViewController.m 中实现此方法此方法将帮助您禁用选项UITextField
。
It Includes paste, select, selectAll and copy option on your Corresponding UITextField
.
它包括粘贴、选择、全选和复制选项UITextField
。
This method is very useful in case of UITextField
when you want to take this for Password or DateOfBirth
or whatever you want.
UITextField
如果您想将其用作密码DateOfBirth
或任何您想要的东西,此方法非常有用。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if ((_TextField1 isFirstResponder] || [_TextFied2 isFirstResponder]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
}
return [super canPerformAction:action withSender:sender];
}
回答by Himanshu Sraswat
In iOS 9 we can hide the copy paste bar from keyboard
在 iOS 9 中,我们可以隐藏键盘上的复制粘贴栏
-(void) customMethod{
yourTextField.inputAssistantItem.leadingBarButtonGroups = @[];
yourTextField.inputAssistantItem.trailingBarButtonGroups = @[];
}
回答by alitosuner
NOTE: In Swift, If you want your text field to disable all UIResponderStandardEditActions
(cut, copy, paste, look up, share, select), use this is UITextFieldDelegate
.
注意:在 Swift 中,如果您希望文本字段禁用所有UIResponderStandardEditActions
(剪切、复制、粘贴、查找、共享、选择),请使用 is UITextFieldDelegate
.
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
textField.isUserInteractionEnabled = false
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.isUserInteractionEnabled = true
}
回答by Raginmari
Small update of this answerfor iOS 10 and earlier (Swift 3):
针对 iOS 10 及更早版本(Swift 3)的此答案的小更新:
open override func target(forAction action: Selector, withSender sender: Any?) -> Any? {
guard isReadonly else {
return super.target(forAction: action, withSender: sender)
}
if #available(iOS 10, *) {
if action == #selector(UIResponderStandardEditActions.paste(_:)) {
return nil
}
} else {
if action == #selector(paste(_:)) {
return nil
}
}
return super.target(forAction: action, withSender: sender)
}
回答by Hugo Jordao
Swift 5 solution:
斯威夫特 5 解决方案:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
return false
}
return true
}
回答by Ali
Try this in your viewController
在你的 viewController 中试试这个
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}