Ограничение копирования, вставка опций для определенного поля UIText - PullRequest
7 голосов
/ 25 ноября 2010

Мой UIView содержит два UITextField. Мне нужно ограничить параметр копирования, вставки для одного текстового поля. Я не хочу ограничивать это для другого.

Когда я использую следующий код, оба поля запрещены для копирования, вставки.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{
    if ( [UIMenuController sharedMenuController] )
    {
            [UIMenuController sharedMenuController].menuVisible = NO;
    }
     return NO;
}

Может ли кто-нибудь дать мне решение моей проблемы.

Ответы [ 4 ]

19 голосов
/ 06 января 2011

Создать подкласс UITextField.В этом подклассе реализуйте

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

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

4 голосов
/ 04 апреля 2012

Следующее запрещает вставку любой строки длиннее 1 символа. Строка длиной 1 символ, однако, будет проходить (может быть полезна для некоторых людей - не требует подклассов).

Сначала дайте вашему textField делегата

myTextField.delegate = self; // OR [myTextField setDelegate:self];

Затем добавьте следующий метод к вашему ViewController

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    if ( [string length] > 1) {
        return NO;
    }
    return YES;
}
2 голосов
/ 09 января 2011

Объяснение от Apple:

Эта реализация по умолчанию этого метода возвращает YES, если класс респондента реализует запрошенное действие, и вызывает следующего респондента, если это не так.Подклассы могут переопределять этот метод для включения команд меню на основе текущего состояния;например, вы должны включить команду «Копировать», если есть выбор, или отключить команду «Вставить», если на монтажной панели не было данных с правильным типом представления монтажной панели.

Итак, решение состоит в том, чтобы создать подкласс UITextView и вернуться правильно.

Подробнее о методе здесь

1 голос
/ 27 августа 2013

У меня была случайная идея, которая отлично работала с текстовым представлением.Нет причин, по которым оно не будет работать с текстовым полем.

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

  • Устройство распознавания жестов при долгом нажатии (1 касание)
  • Распознаватель жестов долгого нажатия (2 касания)
  • Распознаватель жестов касания (2 касания, 1 касание)
  • Распознаватель жестов касания (3 касания, 1 касание)
  • Нажмите «Распознаватель жестов» (1 касание, 2 касания)

Затем ему был присвоен следующий код:

- (IBAction)cancelTouch:(id)sender {
    //do nothing
}

Теперь я все еще могу просматривать текстовое представление, но долгое нажатие илидвойное нажатие теперь абсолютно ничего не делает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...