textView:shouldChangeTextInRanges:replacementStrings: сбой метода при редактировании NSTextStorage

Я новичок в программировании Cocoa под OSX Lion, поэтому на этот вопрос я не могу найти ответ. Мне нужно изменить атрибутивную строку, которая вводится пользователем через файл NSTextView. Редактирование может включать замену некоторых частей строки внутри NSTextStorage и добавление NSTextAttachment объектов. Я реализовал протокол и предоставил его для экземпляра NSTextView в качестве делегата. Я также реализовал метод textView:shouldChangeTextInRanges:replacementStrings: следующим образом:

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

Кажется, что укороченная струна вызывает некоторый выход за пределы поля.

Что я делаю не так и как исправить эту проблему? Пожалуйста помоги.


person Tony    schedule 23.12.2011    source источник
comment
Почему-то у меня тоже есть проблемы с такой проблемой: я пытаюсь добавить атрибуты асинхронно, но выдает ту же ошибку. Мне действительно интересно, откуда эта ошибка.   -  person Paul    schedule 22.01.2012


Ответы (1)


Метод -length возвращает количество символов в NSString. Проблема в том, что первый символ в индексе 0. Попробуйте использовать [buf length] - 1. Это должно работать.

person Fernando Valente    schedule 22.01.2012