Как отключить опцию копирования и вставки из UITextField программно - PullRequest
41 голосов
/ 15 июля 2011

Я делаю регистрационное предупреждение, в котором есть UITextField, где пользователь может ввести свой регистрационный номер.все в значительной степени их, однако я хотел бы удалить функцию копирования и вставки из текстового поля программно, поскольку они не являются версией текстового поля InterfaceBuilder. Я не знаю, как это сделать.далеко ...

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

}

Ответы [ 15 ]

46 голосов
/ 15 июля 2011

В этом посте есть много хороших решений: Как отключить Копирование, Вырезать, Выбрать, Выбрать все в UITextView

Мой любимый - переопределить canPerformAction:withSender::

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(paste:))
        return NO;
    return [super canPerformAction:action withSender:sender];
}
22 голосов
/ 03 марта 2015

Я нашел способ с помощью swift, используя extension и relatedObject без подклассов.Я использую свойство только для чтения, чтобы отключить вставку / вырезание, но этот пример можно адаптировать.

Swift 3 обновлено по состоянию на 27.11.2016* Другой Свифт (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)
    }

}
22 голосов
/ 30 сентября 2014

Для iOS8.0 +, Xcode 6.0.1, ARC включен

В надежде спасти новичка, как и я, какое-то время реализуя это ...

Для реализации отключения копирования / вставки / вырезать / и т. Д.Вы должны создать подкласс UITextField и переопределить ...

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

Для этого ...

Создать новый класс, который является подклассом UITextField (т.е. новыйФайлы .h и .m должны быть включены в папку вашего приложения).Так File-> New -> «Какао Touch Class» -> Next -> «PasteOnlyUITextField» (например), подкласс «UITextField» -> Next-> Create.

Однажды .hи .m файлы создаются для нашего нового подкласса UITextField с именем "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

Теперь убедитесь, что вы импортируете PasteOnlyUITextField.h, где вы собираетесь его использовать, например, файл YourUIViewController.h ...

#import "PasteOnlyUITextField.h"

Теперь вы должны использовать подкласслибо программно, либо с помощью инспектора идентификации

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

или ...

Выберите UITextField и перейдите к инспектору идентификации, выберите его класс.

identity inspector

Вы можете изменить логику, связанную с опциями меню, по своему усмотрению ...

Надеюсь, это поможет!Спасибо всем оригинальным авторам.

19 голосов
/ 22 июня 2017

Пользователи раскадровки могут захотеть взглянуть на это решение, если вы в порядке с подклассами.

Я не думаю, что есть простой способ добиться этого с помощью расширений или протоколов.

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

Суть ссылки

12 голосов
/ 09 марта 2017

Реализация этого метода в ViewController.m Этот метод поможет вам отключить параметры на UITextField.

Включает в себя вставку, выбор, выбор всего и копирование на вашем соответствующем UITextField.

Этот метод очень полезен в случае 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];
}
8 голосов
/ 14 сентября 2015

В iOS 9 мы можем скрыть панель вставки копирования с клавиатуры

-(void) customMethod{

   yourTextField.inputAssistantItem.leadingBarButtonGroups = @[];
   yourTextField.inputAssistantItem.trailingBarButtonGroups = @[];

}
2 голосов
/ 05 ноября 2018

ПРИМЕЧАНИЕ. В Swift, если вы хотите, чтобы ваше текстовое поле отключило все UIResponderStandardEditActions (вырезать, скопировать, вставить, посмотреть, поделиться, выбрать), используйте это UITextFieldDelegate.

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

func textFieldDidEndEditing(_ textField: UITextField) {
    textField.isUserInteractionEnabled = true
}
2 голосов
/ 13 февраля 2017

Небольшое обновление этот ответ для 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)
}
1 голос
/ 24 июля 2017

Попробуйте это в вашем viewController

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
        }];
        return [super canPerformAction:action withSender:sender];
    }
1 голос
/ 08 июня 2017

Если отключенный выбор текста работает для вас, попробуйте это.

class NoMoreSelectionTextField: UITextField {

    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }

    override var selectedTextRange: UITextRange? {
        get { return nil }
        set { return }
    }
}
...