webentwicklung-frage-antwort-db.com.de

Deaktivieren der programmgesteuerten Option zum Kopieren und Einfügen von UITextField

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

}
38
C.Johns

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];
}
46
PengOne

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

}
23
dtissera

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.

identity inspector

Sie können die mit den Menüoptionen verknüpfte Logik nach Belieben ändern.

Hoffe das hilft! Vielen Dank an alle Mitwirkenden.

22
serge-k

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.

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

Hauptlink

14
gujci

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];
}
11
Himani Sharma

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 = @[];

}
8

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)
}
2
Raginmari

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];
    }
1
Ali

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
}
1
mstntsnr

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 }
    }
}
1
ukaszm

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
}
0
Hugo Jordao

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
    }
}
0
nox