web-dev-qa-db-ja.com

テキストがUITextViewにいつ貼り付けられるかを知る方法

テキストのブロックがUITextViewに貼り付けられると、どのイベントが発生しますか?テキストを貼り付けるときに、textViewのフレームを変更する必要があります。

読んでくれてありがとう。

18
Mrwolfy

UITextViewはそのUITextViewDelegateメソッドを呼び出します

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

代理人が設定されている場合。これは、キーボードで文字が入力されたときと、テキストがテキストビューに貼り付けられたときの両方で呼び出されます。貼り付けられるテキストはreplacementText引数です。

http://developer.Apple.com/library/ios/#documentation/uikit/reference/UITextViewDelegate_Protocol/Reference/UITextViewDelegate.html#//Apple_ref/occ/intf/UITextViewDelegate を参照してください。

13
joseph.hainline

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;
}
31
carlos16196

ペーストボードに長い文がある場合、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
 }
14

この動作するパーフェクト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
GovindhaRaj

carlos16196は良いアプローチでしたが、[text isEqualToString:[UIPasteboard generalPasteboard].string][text containsString:[UIPasteboard generalPasteboard].string]に変更して微調整することもできます。

これを行うことにより、ユーザーがUIPasteboardにない他の入力されたテキストの後にテキストビューに貼り付けたときを検出します。

これはコードです:

-(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;
}
4
danielrosero

サブクラスUITextviewを試して、この関数をオーバーライドしてください。

public override func paste(_ sender: Any?) 
2
slboat

これは、貼り付けられた画像を検出するために使用するものです。

- (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;
}
0
Joseph Razon IL

Swift5.1用です

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let paste = UIPasteboard.general.string, text == paste {
       print("paste")
    } else {
       print("normal typing")
    }
    return true
}
0
User18474728