Comment désactiver l'option copyr-coller de UITextField par programme

Je fais une alerte alertview qui a un UITextField dans lequel l'user peut entrer son numéro d'logging. tout est à peu près leur, mais je voudrais supprimer la fonction copyr-coller du champ de text par programmation, car leur version n'est pas InterfaceBuilder du champ de text, je n'ai aucune idée de comment faire cela ..

Voici mon UIalertview jusqu'ici …

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

Ce post a beaucoup de bonnes solutions: Comment désactiver copyr, couper, sélectionner, tout sélectionner dans UITextView

Mon préféré est de surcharger canPerformAction:withSender: ::

 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(paste:)) return NO; return [super canPerformAction:action withSender:sender]; } 

Pour iOS8.0 +, Xcode 6.0.1, ARC activé

Espérant sauver un débutant, comme moi, un certain time de mise en œuvre de cette …

Pour implémenter copyr / coller / couper / etc. vous devez sous-classr UITextField et replace …

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

Pour faire ça…

Créez une nouvelle class qui est une sous-class de UITextField (c'est-à-dire un nouveau file .h et .m à inclure dans votre dossier d'application). Donc Fichier-> Nouveau -> "Cocoa Touch Class" -> Suivant -> "PasteOnlyUITextField" (par exemple), sous-class de "UITextField" -> Next-> Create.

Une fois les files .h et .m créés pour notre nouvelle sous-class de UITextField appelée "PasteOnlyUITextField" …

PasteOnlyUITextField.h

 #import <UIKit/UIKit.h> @interface PasteOnlyUITextField : UITextField @end 

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 

Maintenant, assurez-vous d'importer PasteOnlyUITextField.h où vous allez l'utiliser, par exemple le file YourUIViewController.h …

 #import "PasteOnlyUITextField.h" 

Vous devez maintenant utiliser la sous-class, soit de façon programmatique, soit avec un inspecteur d'identité

 PasteOnlyUITextField *pasteOnlyUITextField = [[PasteOnlyUITextField alloc] init...]; 

ou…

Sélectionnez l'UITextField et accédez à l'inspecteur d'identité, select sa class.

inspecteur d'identité

Vous pouvez changer la logique associée aux options de menu comme bon vous semble …

J'espère que cela t'aides! Merci à tous les consortingbuteurs originaux.

J'ai trouvé un moyen avec swift en utilisant extension et associatedObject sans sous-class. J'utilise une propriété en lecture seule pour désactiver le collage / découpage mais cet échantillon peut être adapté.

Swift 3 mis à jour le 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) } } 

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

Implémentez cette méthode dans ViewController.m Cette méthode vous aidera à désactiver les options sur UITextField .

Il comprend l'option coller, select, selectAll et copyr sur votre UITextField correspondant.

Cette méthode est très utile dans le cas de UITextField lorsque vous voulez prendre ceci pour le mot de passe ou DateOfBirth ou ce que vous voulez.

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

Dans iOS 9, nous pouvons cacher la barre de collage de copyr du keyboard

 -(void) customMethod{ yourTextField.inputAssistantItem.leadingBarButtonGroups = @[]; yourTextField.inputAssistantItem.trailingBarButtonGroups = @[]; } 

Les users de storyboard peuvent vouloir regarder cette solution, aussi longtime que vous êtes d'accord avec le sous-classment.

Je ne pense pas qu'il existe un moyen facile d'y parvenir par le biais d'extensions ou de protocoles.

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

Gist lien

Petite mise à jour de cette réponse pour iOS 10 et versions antérieures (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) } 

vous pouvez extension textview ou textfield dans swift, comme ceci:

 extension UITextView { open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } 

Si la sélection de text désactivée fonctionne pour vous, essayez ceci.

 class NoMoreSelectionTextField: UITextField { override func caretRect(for position: UITextPosition) -> CGRect { return CGRect.zero } override var selectedTextRange: UITextRange? { get { return nil } set { return } } } 

Essayez ceci dans votre vueController

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

utiliser pour iOS 7 ou plus tard

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

}

Remplacer targetForAction: withSender est meilleur IMHO:

 - (id)targetForAction:(SEL)action withSender:(id)sender { if (action == @selector(paste:)) { return nil; } return [super targetForAction:action withSender:sender]; } 

Version 3.0 de Swift

 class NoMenuTextField: UITextField { override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { if (action == #selector(NSObject.paste(_:))) { return false } return super.canPerformAction(action, withSender: sender) } } 

Définissez simplement userInteractionEnabled = NO;