Определить, когда пользователь нажимает кнопку вставки в UITextView - PullRequest
6 голосов
/ 14 июля 2009

У меня возникла проблема при попытке изменить поведение вырезания / копирования / вставки UITextView. Чего я хочу добиться: определить, когда пользователь вставил некоторый текст в UITextView. Когда я обнаружу это, я проверю данные и сделаю свое дело.

По документам я узнал о UIResponder.

Итак, я создал простой класс, который наследует UITextView. в файле .m я создаю 1 функцию с именем.

-(void) paste:(id)sender{
  NSLog(@"paste button was pressed do something");
}

Но по какой-то причине он никогда не срабатывает. Я мог бы заставить оператор select работать и отслеживать данные.

-(void) select:(id)sender

1. Это правильный способ обнаружения вставки в UITextView? 2. Прямо сейчас я отслеживаю, сколько персонажей меняет UITextView, и если его значение превышает один символ, я подозреваю, что это может быть операция вставки. Но так как iPhone может автоматически завершать слова, например Wedn (отправляется в среду), возможно, это не вставка.

В Интерфейсном Разработчике я выбрал свой textView в моем NIB-файле и выбрал его «Class Identity» для моего почти созданного класса ранее, и я знаю, что этот файл работал как подкласс, но он просто не отвечал на событие Paste .

спасибо.

Ответы [ 4 ]

3 голосов
/ 15 июля 2009

UITextView имеет представление, которое обрабатывает вырезать, копировать, вставить. Это UIWebDocumentView. Так что, если UITextView является первым респондентом, UIWebDocumentView получит его первым вместо вашей реализации. Я хотел бы переписать эти функции, так что это очень расстраивает.

3 голосов
/ 26 июля 2009

То же самое происходит со мной тоже. Вызов (и иногда копирование) вызывается, но никогда не вставляется.

Я смоделировал поведение, используя textViewDidChange, где я всегда проверяю разницу между текущим текстом и предыдущим. Если есть разные буквы и длина text.length больше, чем должна быть вставлена.

Надеюсь, Apple исправит это.

2 голосов
/ 10 апреля 2013

Если кому-то все еще нужно короткое и простое решение, я поделюсь своим. Я использую замечательную категорию NSObject + REResponder из REKit проекта . Решение так же просто, как это:

- (void)hookMessageTextFieldPasteAction
{
    void (^textFieldDidPasteBlock)(id receiver, id sender) = ^(id receiver, id sender)
    {
        NSLog(@"paste hook");
    };
    [self.messageTextField respondsToSelector:@selector(paste:) withKey:nil usingBlock:textFieldDidPasteBlock];
}
1 голос
/ 14 июля 2009

Да, приведенный выше код для вставки является правильным в соответствии с документацией Apple, которая ссылается на него здесь .

- (void)paste:(id)sender

Я подозреваю, что вы внедрили его не в тот файл. Вы должны реализовать его в файле, который является частью первой цепочки респондента. Вы подклассифицировали UITextView или используете ванильный в вашем ViewController?

Хммм. Думаю, проблема в том, что вам может понадобиться, чтобы ваш подкласс UITextView стал делегатом, чтобы метод делегата работал, потому что это не по внешнему виду. Я постараюсь выяснить, как я это делал раньше.

Хорошо, думаю, я нашел это. Я думаю, что вам нужно сделать это на вашем подклассе UITextField:

@interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate>
{

}

Добавление этого в конец должно работать, попробуйте! Он делает ваш подкласс объектом типа, на который делегат может отправить уведомление ... это полиморфизм, если кто-то не захочет исправить меня здесь:)

И последнее, что нужно попробовать Джону, в ViewController, который содержит IBOutlet для UITextView, попробуйте вызвать этот метод в экземпляре UITextView:

[myUITextView setDelegate:self];

Просто чтобы добавить что-то совершенно случайное, попробуйте установить его в качестве первого респондента.

[myUITextView becomeFirstResponder];

Это называется программирование в темных детишках! И это очень плохой способ программирования, но я признаю, что делаю это, и иногда это окупается: P lol.

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