2009-07-14 2 views
6

UITextViewの切り取り/コピー/貼り付け動作を変更しようとするとかなりの問題が発生しています。 私が達成したいのは、ユーザーが何らかのテキストを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(水曜日に行く)などの単語を自動完成することができるので、ペースト操作ではない可能性があります。

Interface Builderでは、NIBファイルでtextViewを選択し、以前作成したクラスに「Class Identity」を選択していましたが、このファイルはサブクラスとして機能していましたが、イベント。

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

答えて

2

誰かがまだ短くて簡単な解決策を必要とする場合は、私は私のものを共有します。私はREKit projectからwonderfull NSObject + REResponderカテゴリを使用します。このソリューションは、次のように簡単です:

- (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

はい、上記のコードは、アップルの文書「here」によれば正しいものです。

- (void)paste:(id)sender 

誤ったファイルに実装している可能性があります。第1レスポンダチェーンの一部であるファイルに実装する必要があります。 UITextViewをサブクラス化したか、ViewControllerでバニラを使用していますか?

Hmmm私は、デリゲートメソッドが機能するためには、UITextViewサブクラスをデリゲートにする必要があるかもしれないと思っています。私は以前にそのことをどうやって見つけようとしています。

私はそれを見つけたと思う。私はあなたのサブクラスUITextFieldクラスでこれを行うために必要があると思う:

@interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate> 
{ 

} 

は最後に、仕事それを試してみる必要があることを追加します! あなたのサブクラスは、デリゲートが通知を送信できるタイプのオブジェクトになります。誰かがここで私を修正しない限り、多態性です。:)

ジョンを試して最後に1つは、 UITextViewにIBOutletが含まれているのViewControllerは、UITextViewのインスタンス上でこのメソッドを呼び出すしてみてください。

[myUITextView setDelegate:self]; 

ちょうどそれがファーストレスポンダになるために設定してみてくださいそこに完全にランダムな何かをスローします。

[myUITextView becomeFirstResponder]; 

これは暗い児童のプログラミングと呼ばれています!そしてプログラムするのが非常に悪い方法ですが、私はそれをし、時にはそれを支払うことを認めます:P lol。

+0

こんにちは、私はUITextViewをサブクラス化し、そのサブクラスが他のメソッドを実装していることを知っています。 サブクラスにも貼り付けコードがありました。しかし、これはうまくいかないようです(シミュレータではうまくいきます)。 –

+0

私は自分の答えを更新しましたが、Simulatorは知っているだけの違いはありません。あなたに+1 btwを与えました:P –

+0

もう一度、私はあなたがUITextFeildDelegateを持っていることを示唆したようにこれを使用しました。 (ID): - : @interfaceのBSTextView選択(無効)UITextView ---ここでは、私が "選択" メソッドを実装する場合 ---かなりランダムな何かがある、これは "選択" のために働きます送信者{ \t NSLog(@ "私は選択したい"); } 私は貼り付けを押してもデバイスやシミュレータからの愛はまだありません。 これは実際にはバグだと思う... –

3

UITextViewには、切り取り、コピー、貼り付けを処理するビューがあります。 UIWebDocumentViewです。したがって、UITextViewが最初のレスポンダである場合、UIWebDocumentViewは実装の代わりに最初に取得します。私はこれらの機能を上書きしたいので、これは非常にイライラです。

+0

こんにちはLillian、あなたはこれまで働いたことがありますか? –

+0

申し訳ありません。幸運なことに...うまくいけば、アップルは私たちのためにそれを開きます。 –

3

同じことが私にも起こります。選択(そして時にはコピー)は呼び出されますが、決して貼り付けられません。

私は、現在のテキストと以前のテキストの違いを常に確認するtextViewDidChangeを使用して動作をシミュレートしました。より多くの文字があり、text.lengthが貼り付けられていなければならないよりも大きい場合。

希望Appleはこれを修正します。

+0

これはまさに私がやっていることです。しかし、水曜日のようなものは自動的に完了し、あなたに誤った読みを与えることを警告してください。注意して、textview.lengthを1より大きくする必要があります。 –

関連する問題