2011-12-23 3 views
0

OSX LionのCocoaプログラミングを初めて使用しました。これは私が答えを見つけることができない質問です。 NSTextViewを通じてユーザーが入力した属性付き文字列を変更する必要があります。 編集には、NSTextStorage内の文字列の一部の置換とNSTextAttachmentオブジェクトの追加が含まれます。 私はプロトコルを実装し、代理人としてNSTextViewインスタンスに提供しました。 は、私はまた、次の方法でメソッドtextView:shouldChangeTextInRanges:replacementStrings:を実装:textView:shouldChangeTextInRanges:replacementStrings:NSTextStorageの編集時にメソッドがクラッシュする

- (BOOL)textView:(NSTextView *)textView shouldChangeTextInRanges:(NSArray *)affectedRanges replacementStrings:(NSArray *)replacementStrings{ 
    NSTextStorage* ts=[textView textStorage]; 
    [ts beginEditing]; 
    NSMutableString* buf=[ts mutableString]; 
    //make some completions 
    NSRange rng; 
    rng.location=0; 
    rng.length=[buf length]; 
    [buf replaceOccurrencesOfString:@"(." withString:@"(0." options:0 range:rng]; 
    rng.location=0; 
    rng.length=[buf length]; 
    [buf replaceOccurrencesOfString:@"-+" withString:@"-" options:0 range:rng]; 
    rng.location=0; 
    rng.length=[buf length]; 
    [buf replaceOccurrencesOfString:@"+-" withString:@"-" options:0 range:rng]; 

    [ts endEditing]; 
    return YES; 
} 

をこのように、私は次のシナリオを試してください:アプリケーションが起動しているとき、NSTextViewいくつかのテキスト内のユーザーの種類。 。彼のタイプ「(」すべてがうまくいく。しかし、彼はタイプされている場合は、「 - +」(マイナス、プラス、空白) - メソッドがこのダンプを生成するクラッシュ:

[NSConcreteTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds 
(
    0 CoreFoundation      0x00007fff95963286 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff8c32bd5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff959630ba +[NSException raise:format:arguments:] + 106 
    3 CoreFoundation      0x00007fff95963044 +[NSException raise:format:] + 116 
    4 AppKit        0x00007fff90acb5bd -[NSConcreteTextStorage attributesAtIndex:effectiveRange:] + 121 
    5 AppKit        0x00007fff90f4cde6 -[NSTextView insertText:replacementRange:] + 840 
    6 AppKit        0x00007fff910fc891 -[NSTextInputContext handleTSMEvent:] + 2289 
    7 AppKit        0x00007fff910fe4fe _NSTSMEventHandler + 165 
    8 HIToolbox       0x00007fff89745308 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1263 
    9 HIToolbox       0x00007fff89744914 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 446 
    10 HIToolbox       0x00007fff8975b6c7 SendEventToEventTarget + 76 
    11 HIToolbox       0x00007fff89930a4d SendTSMEvent + 35 
    12 HIToolbox       0x00007fff89930dd4 SendUnicodeTextAEToUnicodeDoc + 452 
    13 HIToolbox       0x00007fff8993095e TSMKeyEvent + 629 
    14 HIToolbox       0x00007fff8976f81a TSMProcessRawKeyEvent + 2350 
    15 AppKit        0x00007fff910fbade -[NSTextInputContext handleEvent:] + 639 
    16 AppKit        0x00007fff90fc7eaf -[NSView interpretKeyEvents:] + 248 
    17 AppKit        0x00007fff90f40c65 -[NSTextView keyDown:] + 691 
    18 AppKit        0x00007fff90a20544 -[NSWindow sendEvent:] + 7430 
    19 AppKit        0x00007fff909b868f -[NSApplication sendEvent:] + 5593 
    20 AppKit        0x00007fff9094e682 -[NSApplication run] + 555 
    21 AppKit        0x00007fff90bcd80c NSApplicationMain + 867 
    22 myapp       0x0000000100001302 main + 34 
    23 myapp       0x00000001000012d4 start + 52 

短縮文字列がいくつか出を引き起こしているようです

私はこの問題を私が間違ってやっているとどのように修正することができます。流出境界--of?助けてください。

+0

どういうわけか、この種の問題にも問題があります。属性を非同期で追加しようとしていますが、同じエラーが発生します。私は本当にこのエラーがどこから来るのだろうかと思っています。 – Paul

答えて

0

-length方法は、NSStringの中の文字の数を返します。問題は、最初の文字ということですは0です。[buf length] - 1を使用してください。これはうまくいくはずです。

+0

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

関連する問題