3

UITextViewデリゲートで構成しました。allowsEditingTextAttributesに設定して属性の編集を有効にしましたYES

ユーザーがテキスト ビューに文字を入力すると、デリゲートは textViewDidChange: メッセージを受け取ります。

ただし、ユーザーが属性を変更した場合 (選択を行い、太字または斜体をタップするなど)、no textViewDidChange: メッセージは表示されません。

ドキュメントtextViewDidChangeには、ユーザーが属性を変更したときにメッセージを受け取る必要があると具体的に書かれています。

指定されたテキスト ビューのテキストまたは属性がユーザーによって変更されたことをデリゲートに伝えます。

しかし、それは私にとってはうまくいきません。ここで何が欠けていますか?

4

4 に答える 4

5

iOS 6 でこのシナリオをテストしたところ、まったく同じ結果が得られました。「選択」ポップアップから属性を変更しても、 textViewDidChange:メソッドはトリガーされませんでした。これはバグであるか、ドキュメントでどのタイプの属性変更がこのイベントをトリガーするかを明確にする必要があるようです。

考えられる回避策は、メソッドを実装するtextViewDidChangeSelection:ことです。選択が行われるたびに呼び出されます (属性を変更する前にユーザーが行う必要があります)。selectedRange.length が > 0 かどうかを確認し (これは、カーソルを移動するだけでなく、実際の単語が選択されたことを意味します)、その selectedRange を保存します。長さが再びゼロになると、アイテムの選択が解除されたことを意味します。その時点で、前の範囲を使用してテキストを操作できます。

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    static BOOL rangeSet = NO;
    static NSRange mySelectedRange;
    if( textView.selectedRange.length > 0 && !rangeSet )
    {
        mySelectedRange = textView.selectedRange;
        rangeSet = YES;
    }
    else if( textView.selectedRange.length == 0 && rangeSet)
    {
        // Work with text
        NSLog(@"Working with previously select text: %d, %d", mySelectedRange.location, mySelectedRange.length);
    }
}
于 2012-10-25T13:53:25.460 に答える
3

ドキュメントでは、次のことも言及されています。

This method is not called in response to programmatically initiated changes

したがって、太字または斜体をプログラムで設定している場合、このデリゲート メソッドは呼び出されません。

于 2012-10-25T04:37:42.897 に答える
2

.hファイルにUITextViewDelegateが設定されているかどうかを確認してください。また、あなたは`作る必要があります

yourTextView.delegate = self

テキストビューが現在のクラスを制御できるようにします。

于 2012-10-25T04:34:47.517 に答える