Ich mache eine Registrierungsalarmansicht, die ein UITextField enthält, in das der Benutzer seine Registrierungsnummer eingeben kann. Alles ist so ziemlich ihr, aber ich möchte die Funktion zum Kopieren und Einfügen programmatisch entfernen, da es keine InterfaceBuilder-Version des Textfelds gibt.
hier ist mein UIalertview soweit ...
- (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];
}
Dieser Beitrag hat viele Nice-Lösungen: Deaktivieren Sie Kopieren, Ausschneiden, Auswählen, Alles auswählen in UITextView
Mein Favorit ist, canPerformAction:withSender:
zu überschreiben:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
return NO;
return [super canPerformAction:action withSender:sender];
}
Ich habe mit Swift einen Weg gefunden, der extension und AssociatedObject verwendet, ohne Unterklassen .. Ich benutze eine Eigenschaft readonly, um das Einfügen/Ausschneiden zu deaktivieren.
Swift 3 aktualisiert am 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)
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)
}
}
Für iOS8.0 +, Xcode 6.0.1, ARC aktiviert
In der Hoffnung, einen Anfänger wie mich zu retten, einige Zeit damit umzusetzen ...
Um das Deaktivieren von Kopieren/Einfügen/Ausschneiden/etc zu implementieren. Sie müssen UITextField subclass und überschreiben ...
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
Um dies zu tun...
Erstellen Sie eine neue Klasse, die eine Unterklasse von UITextField ist (d. H. Neue .h- und .m-Dateien, die in Ihrem App-Ordner enthalten sein sollen). Also File -> New -> "Cocoa Touch Class" -> Next -> "PasteOnlyUITextField" (zum Beispiel), Unterklasse von "UITextField" -> Next -> Create.
Sobald die .h- und .m-Dateien für unsere neue Unterklasse von UITextField mit dem Namen "PasteOnlyUITextField" erstellt wurden ...
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
Stellen Sie nun sicher, dass Sie PasteOnlyUITextField.h importieren, wo Sie es verwenden werden, z. IhreUIViewController.h-Datei ...
#import "PasteOnlyUITextField.h"
Jetzt müssen Sie die Unterklasse entweder programmgesteuert oder mit Identity Inspector verwenden.
PasteOnlyUITextField *pasteOnlyUITextField = [[PasteOnlyUITextField alloc] init...];
oder...
Wählen Sie das UITextField aus, und wechseln Sie zum Identitätsinspektor, und wählen Sie seine Klasse aus.
Sie können die mit den Menüoptionen verknüpfte Logik nach Belieben ändern.
Hoffe das hilft! Vielen Dank an alle Mitwirkenden.
Storyboard-Benutzer möchten möglicherweise diese Lösung betrachten, sofern Sie mit der Unterklassifizierung zufrieden sind.
Ich denke nicht, dass es einen einfachen Weg gibt, dies durch Erweiterungen oder Protokolle zu erreichen.
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)
}
}
}
Implementieren Sie diese Methode in ViewController.m Diese Methode hilft Ihnen, Optionen für UITextField
zu deaktivieren.
Enthält die Einfügen-, Auswählen-, Auswählen- und Alles- und Kopieroption in Ihrem entsprechenden UITextField
.
Diese Methode ist sehr nützlich für UITextField
, wenn Sie dies als Kennwort oder DateOfBirth
verwenden möchten oder was auch immer Sie möchten.
- (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];
}
In iOS 9 können wir die Leiste zum Einfügen von Kopieren vor der Tastatur ausblenden
-(void) customMethod{
yourTextField.inputAssistantItem.leadingBarButtonGroups = @[];
yourTextField.inputAssistantItem.trailingBarButtonGroups = @[];
}
Kleines Update von dieser Antwort für iOS 10 und früher (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)
}
Versuche dies in deinem viewController
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
HINWEIS: Wenn Sie in Swift alle UIResponderStandardEditActions
deaktivieren möchten (Ausschneiden, Kopieren, Einfügen, Nachschlagen, Freigeben, Auswählen), verwenden Sie UITextFieldDelegate
.
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
textField.isUserInteractionEnabled = false
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.isUserInteractionEnabled = true
}
Wenn die deaktivierte Textauswahl für Sie funktioniert, versuchen Sie dies.
class NoMoreSelectionTextField: UITextField {
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
override var selectedTextRange: UITextRange? {
get { return nil }
set { return }
}
}
Swift 5 Lösung:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
return false
}
return true
}
sie können die Erweiterung Textview oder Textfeld in Swift wie folgt hinzufügen:
extension UITextView {
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}