Как узнать, когда текст вставляется в UITextView

Какое событие запускается, когда блок текста вставляется в UITextView? Мне нужно изменить кадр моего textView, когда текст вставлен.

Спасибо за чтение.

Ответ 1

Ваш UITextView вызовет его метод UITextViewDelegate

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

если делегат настроен. Это вызывается как при наведении символа на клавиатуре, так и при вставке текста в текстовое представление. Вложенный текст - это аргумент replaceText.

См. http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextViewDelegate_Protocol/Reference/UITextViewDelegate.html#//apple_ref/occ/intf/UITextViewDelegate

Ответ 2

Вот что я использую для обнаружения событий вставки в UITextView:

 // Set this class to be the delegate of the UITextView. Now when a user will paste a text in that textview, this delegate will be called.
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    // Here we check if the replacement text is equal to the string we are currently holding in the paste board
    if ([text isEqualToString:[UIPasteboard generalPasteboard].string]) {

        // code to execute in case user is using paste

    } else {

        // code to execute other wise
    }

    return YES;
}

Ответ 3

Проверка картонной строки на if string == UIPasteboard.general.string занимает пару секунд, если у вас длинное предложение в картотеке. Пользователь видит, что клавиатура заблокирована во время этой проверки. Мое решение состоит в том, чтобы проверить, больше ли длина новых символов больше 1. Если длина больше 1, строка выводится из картона.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if string.characters.count > 1{
            //User did copy & paste

        }else{
            //User did input by keypad
        }            
         return true
 }

Ответ 4

Это рабочий Perfect Xcode 9.4 Swift 4.1

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text.contains(UIPasteboard.general.string ?? "") {
        return false
    }
    return true
}

Когда пользователь пытается вставить в текстовое поле, условие if будет выполнено
Этот код перестанет вставлять

Ответ 5

carlos16196 был хорошим подходом, но я бы также подстроил его, изменив [text isEqualToString:[UIPasteboard generalPasteboard].string] на [text containsString:[UIPasteboard generalPasteboard].string]

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

Это код:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

// Here we check if the replacement text is equal to the string we are currently holding in the paste board
if ([text containsString:[UIPasteboard generalPasteboard].string]) {

    // code to execute in case user is using paste

} else {

    // code to execute other wise
}

return YES;
}

Ответ 6

попробуйте подклассы UITextview и переопределите эту функцию.

public override func paste(_ sender: Any?) 

Ответ 7

Вот что я использую для обнаружения вставленных изображений:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if (UIPasteboard.generalPasteboard.image &&
        [UIPasteboard.generalPasteboard.string.lowercaseString isEqualToString:text.lowercaseString]) {

       //Pasted image

        return NO;
    }

    return YES;
}

Ответ 8

В SWIFT 4:

func textViewDidChange(_ textView: UITextView) {

    if(textView.text == UIPasteboard.general.string)
    {
        //Text pasted
    }
}