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);
}
}