Estoy haciendo un registro de alertview que tiene un UITextField en donde el usuario puede introducir su número de registro. todo es bastante más que su, sin embargo, me gustaría quitar la función de copiar y pegar desde el campo de texto mediante programación ya no es la InterfaceBuilder versión de la textfield no tengo idea de cómo hacer esto..

aquí Está mi UIalertview hasta ahora…

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

}
InformationsquelleAutor C.Johns | 2011-07-14

16 Comentarios

  1. 48

    Este post tiene muchas buenas soluciones: Cómo deshabilitar Copiar, Cortar, Seleccionar, Seleccionar Todo en UITextView

    Mi favorito es reemplazar canPerformAction:withSender::

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        if (action == @selector(paste:))
            return NO;
        return [super canPerformAction:action withSender:sender];
    }
    • En iOS 7 me estoy poniendo un montón de errores con este. He aquí algunos de los texto de error: CGContextSetFillColorWithColor: no válido contexto 0x0. Esto es un grave error. Esta aplicación, o una biblioteca que se utiliza, es el uso de un contexto no válido y está contribuyendo a la degradación general de la estabilidad del sistema y la fiabilidad. Este aviso es una cortesía: por favor solucionar este problema. Se convertirá en un error fatal en una próxima actualización.
    • para iOS 7 stackoverflow.com/questions/15745824/…
    • Tenga en cuenta que también existe el «reemplazar» elemento de menú que no se puede deshabilitar (en modo seguro) de canPerformAction:withSender. Para desactivar la pasta, desactivar la revisión ortográfica a través de la UITextField‘s UIInputTraits protocolo.
  2. 22

    Para iOS8.0+, Xcode 6.0.1, ARCO habilitado

    Con la esperanza de salvar a un principiante como yo, en algún momento de implementar esta…

    Para implementar la desactivación de copiar/pegar/cortar/etc. usted debe subclase UITextField y reemplazar…

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

    Para hacer esto…

    Crear una nueva clase que es una subclase de UITextField (es decir, una nueva .h and .m los archivos que se incluirán dentro de su carpeta de la aplicación). Así de Archivo->Nuevo->»Cocoa Touch Clase»->Siguiente>»PasteOnlyUITextField» (por ejemplo), subclase de «UITextField»->Siguiente>Crear.

    Una vez que el .h and .m archivos son creados por nuestra nueva subclase de UITextField llamado «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

    Ahora asegúrese de que usted importación de PasteOnlyUITextField.h donde se va a usar, por ejemplo, YourUIViewController.h archivo…

    #import "PasteOnlyUITextField.h"

    Ahora debe usar la subclase, ya sea progrommatically o con la identidad del inspector de

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

    o…

    Seleccione el UITextField y vaya a la identidad del inspector, seleccione su clase.

    Cómo deshabilitar la opción de copiar y pegar de UITextField mediante programación

    Puede cambiar la lógica asociados con las opciones de menú como mejor le parezca…

    Espero que esto ayude! Gracias a todos los colaboradores.

    • No, no volver manta falsa en la final del método. Tienen que registra todas las acciones que se reciben? Muy pocos de ellos – la mayoría, incluso – son privadas de Apple acciones que no son de su negocio de control. Por ejemplo, _accessibilitySpeak es probablemente una característica para personas con deficiencias visuales a los usuarios que usted desea. _transliterateChinese es otro interesante. Mejor desactivar lo que usted definitivamente no quiere y someterlo a la superclase para los demás.
    • Lo que yo quería es un campo de texto que tiene sólo una acción, y esa acción es la pasta. Tengo una muy básica de la aplicación. se llama «C/F Convertir» y «Medidor de Hadas» con esta estrategia, tanto revisados y aprobados por Apple. Mi respuesta da, lo que yo pienso, es una descripción más detallada para la creación de subclases UITextField para lograr esto, y usted es libre de hacer lo que le parezca mejor para su aplicación. Si Apple quería proteger a esta clase en particular, luego de que le impiden ser capaz de subclase directamente y tienes que crear una categoría a la clase para alterar el permitido de las propiedades o métodos.
    • Porque se devuelve TRUE sólo para PEGAR, creo que no hay ningún problema en la respuesta.
    • Pero la pregunta es preguntar sobre el contrario. Para ese caso, @PengOne la respuesta es correcta.
    • Entiendo que la respuesta se logra el objetivo de la pregunta. Pero es una mala práctica que causa ajena efectos secundarios como afectan la accesibilidad. Si la gente copia de esta respuesta y los resultados en su aplicación no funciona igual de bien para los ciegos/sordos a la gente, que es muy malo. PengOne respuesta es correcta y que en realidad upvoted hace años!
  3. 22

    He encontrado una forma rápida mediante la extensión y associatedObject sin subclases.
    Yo uso una propiedad readonly para deshabilitar pegar/cortar pero este ejemplo se puede adaptar.

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

    Otros 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)
        }
    
    }
    • Este es por lejos el enfoque más flexible.
    • Puede usted proporcionar gist código?
  4. 21

    Storyboard usuarios posible que desee mirar a esta solución, siempre y cuando usted está bien con la creación de subclases.

    No creo que hay una manera sencilla de lograr esto a través de extensiones o protocolos.

    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 enlace

    • Creo que el caso por defecto debe ser «return super.canPerformAction(acción, withSender: remitente)» en lugar de «return true». De lo contrario, el menú tendrá todas las acciones que no pueden ser relacionados con UITextField
    • Buena captura
    • Yo creo que esto no debe ser marcado como el aceptado respuesta, bella solución.
  5. 12

    Implementar este Método en ViewController.m Este Método le ayudará a desactivar Opciones en UITextField.

    Incluye pegar, seleccionar, selectAll y la opción copiar en su Correspondiente UITextField.

    Este método es muy útil en caso de UITextField cuando usted quiere tomar esta Contraseña o DateOfBirth o lo que quieras.

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

    En iOS 9 se puede ocultar el copiar y pegar de la barra de teclado

    -(void) customMethod{
    
       yourTextField.inputAssistantItem.leadingBarButtonGroups = @[];
       yourTextField.inputAssistantItem.trailingBarButtonGroups = @[];
    
    }
    • Ja! Esto es genial. Me gustaría advertir que también te podrían atacar con armas nucleares a ciertas opciones para que los usuarios ciegos, de Asia y de lenguaje de los usuarios, y «definir».
  7. 2

    Pequeña actualización de esta respuesta para iOS 10 y anteriores (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)
    }
  8. 2

    NOTA: En Swift, Si desea que su campo de texto para desactivar todos los UIResponderStandardEditActions (cortar, copiar, pegar, buscar, compartir, seleccionar), el uso de este es UITextFieldDelegate.

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        textField.isUserInteractionEnabled = false
        return true
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.isUserInteractionEnabled = true
    }
  9. 1

    Si se deshabilita la selección de texto que funciona para usted, trate de esto.

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

    Intente esto en su viewController

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

    Swift 5 solución:

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
            return false
        }
    
        return true
    }
  12. 0

    puedes extensión textview o textfield en swift, como este:

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

    Primordial targetForAction:withSender es mejor en mi humilde opinión:

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

    Swift versión 3.0

    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)
        }
    }
  15. -3

    uso para iOS 7 o posterior

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

    }

    • Este es idéntica a la de @Ali respuesta de más de un mes antes!
    • También he utilizado Ali respuesta. Esto debería ser eliminado de la simplicidad y de crédito a aquellos que ponen la respuesta primero.
  16. -36

    Acaba de establecer userInteractionEnabled = NO;

    • Esto evita que el teclado de convertirse en el primer respondedor en total.
    • Esto también evita que el usuario escriba en el campo de texto
    • eliminar este ans
    • me mate, por favor

Dejar respuesta

Please enter your comment!
Please enter your name here