2012-09-17 240 views
6

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

ありがとうございます。デリゲートが設定されている場合

+0

私はちょうどだからここshouldChangeメソッドテキストでは、20文字のみ最初に置き換えたい] 20個の以上の文字を.string [UIPasteboard generalPasteboard]のような要件をされていすでにすべてのコピーが付属しています。私はchouldをtrueに変更し、最初の20文字まで変更したいと思います。私はスイープで作業しているので、パラメータ/文字列の値を変更することはできません。誰も私にこれを助けることができますか?ありがとう - –

答えて

7

あなたのUITextViewは、そのUITextViewDelegate方法

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

を呼び出します。これは、キーボードで文字が入力されたときと、テキストがテキストビューに貼り付けられたときの両方で呼び出されます。貼り付けられたテキストはreplacementText引数です。

// 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; 
} 
+0

私は[UIPasteboard generalPasteboard] .string]のような要件が20文字以上です。私はちょうど最初の20文字だけを置き換えたいので、ここではshouldChangeメソッドのテキストが既にすべてコピーされています。最初の20文字まで変更してください。私はスイープで作業しているので、パラメータ/文字列の値を変更することはできません。誰も私にこれを助けることができますか?ありがとう - –

19

iはUITextViewでペーストイベントを検出するために使用するものです参照してください。こうすることで、ユーザーがUIPasteboardにない他のタイプのテキストの後にテキストビューでペーストするときを検出します。

これはコードです:あなたはペーストボードに長文を持っている場合if string == UIPasteboard.general.stringでペーストボードの文字列をチェック

-(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; 
} 
+0

クールなソリューション、それは私のために働いた。ありがとうございました! –

+0

私は[UIPasteboard generalPasteboard] .string]のような要件が20文字以上です。私はちょうど最初の20文字だけを置き換えたいので、ここではshouldChangeメソッドのテキストはすでにすべてコピーされています。私はchouldをtrueに変更し、最初の20文字。私はスイープで作業しているので、パラメータ/文字列の値を変更することはできません。誰も私にこれを助けることができますか?お返事ありがとうございます –

1

carlos16196は良い方法でしたが、私はまた、[text isEqualToString:[UIPasteboard generalPasteboard].string][text containsString:[UIPasteboard generalPasteboard].string]

を変更することで、それを微調整します:

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

+1

投稿コードに記載されている変更を忘れた –

+0

ありがとうございました。 – danielrosero

+0

私は[UIPasteboard generalPasteboard]のような要件を持っています。文字列]は20文字以上です私はちょうど最初の20文字だけを置き換えたいので、ここではshouldChangeメソッドのテキストはすでにすべてコピーされています。私はchouldをtrueに変更し、最初の20文字まで変更したいと思います。私はスイープで作業しているので、パラメータ/文字列の値を変更することはできません。誰も私にこれを助けることができますか?ありがとう - –

8

は数秒かかります。ユーザーは、このチェック中にキーパッドがフリーズしていると見なします。 私の解決策は、新しい文字の長さが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 
} 
+0

技術的には、ユーザーがペーストボードから1文字を貼り付けていた(なぜなぜですか?)か、文字を入力した場合は検出されませんでしたが、すべての目的と目的のためにジョブが実行されます。それは私が使用しようとしているものです。 –

0

サブタイトルを試してみて、この関数をオーバーライドしてください。 SWIFT 4では

public override func paste(_ sender: Any?) 
-1

func textViewDidChange(_ textView: UITextView) { 

    if(textView.text == UIPasteboard.general.string) 
    { 
     //Text pasted 
    } 
} 
関連する問題