1

ユーザーが入力する新しいテキストに適用される書式を検出しようとしています。つまり、カーソルには位置がありますが、テキスト選択はありません (つまり、長さ = 0)。loggingAttributes をクエリしようとするたびに、ログに記録するだけでも、アプリがクラッシュします。

Thread 1:EXC_BAD_ACCESS (code=2, address=0x4)

Debug Navigator で最後に行われるのは次のとおりです。

WebCore::Frame::styleAtSelectionStart() const

そしてその直前に、なるほど

-[UITextView typingAttributes]

0 より大きい selectedRange.length でログに記録すると、問題ないようです。Zombies と Guard Malloc を有効にして実行してみましたが、何も表示されません。

私のテスト プロジェクトでは、UITextView が firstResponder になるとすぐにクラッシュが発生します。

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    [self updateFormatButtons];
}

属性をチェックする呼び出し:

- (void)updateFormatButtons
{    
    UITextView *problemTextView = [self synopsisTextView];
    NSRange selectedRange = [self getSelectedTextRange];
    if (selectedRange.length == 0) // No text selected
    {
     // HELP - Why does the following line cause a crash?
     // NSLog(@"textViewFormatting options: %@", [problemTextView typingAttributes]);
    }
    else
    {
       NSLog(@"Some text selected"); // Fine here
       NSLog(@"textViewFormatting options: %@", [problemTextView typingAttributes]);
    }
}

選択した範囲に基づいて:

- (NSRange)getSelectedTextRange
{ 
    NSRange rangeToReturn = NSMakeRange(NSNotFound, 0);
    UITextView *textView = [self synopsisTextView];
    if ([textView isFirstResponder])
    {
        rangeToReturn = [textView selectedRange];
    }
    return rangeToReturn;
}

提案をいただければ幸いです。

4

1 に答える 1

0

問題は、テキスト ビューの選択が変更されると、typingAttributes 辞書の内容が自動的にクリアされることだったようです。そのため、辞書をすぐに照会すると、ある種の競合が発生していました。呼び出す前に遅延を置くと、それに対処したようです:

[self performSelector:@selector(updateFormatButtons) withObject:nil afterDelay:0.15];
于 2012-12-07T22:03:33.210 に答える