NSTextView + NSTextFinder + мой отдельный NSSearchField

Я пытаюсь реализовать поиск в NSTextView с помощью поискового запроса из моего пользовательского NSSearchField.

Звучит довольно просто, но я не могу заставить его работать.

До сих пор я просмотрел всю документацию Apple о NSTextFinder, его клиент и FindBarContainer. TextFinder просто предоставляет FindBarView для контейнера, и контейнер показывает его при активации поиска.

Вся связь между клиентом, контейнером и TextFinder скрыта. Это просто выглядит как черный ящик, который предназначен для работы "как есть" без каких-либо настроек или вмешательства.

Но что насчет - (void)performAction:(NSTextFinderAction)op метод NSTextFinder? Разве это не для отправки пользовательских команд в TextFinder?

Я пытался присвоить ему новую строку поиска со следующим:

    NSPasteboard* pBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
    [pBoard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, NSPasteboardTypeTextFinderOptions, nil] owner:nil];
    [pBoard setString:_theView.searchField.stringValue forType:NSStringPboardType];
    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:YES], NSTextFinderCaseInsensitiveKey,
                              [NSNumber numberWithInteger:NSTextFinderMatchingTypeContains], NSTextFinderMatchingTypeKey,
                              nil];

    [pBoard setPropertyList:options forType:NSPasteboardTypeTextFinderOptions];

    [textFinder performAction:NSTextFinderActionSetSearchString];

но это не работает и просто нарушает обычную операцию findBar.

У меня сильное чувство, что я делаю что-то не так. Все, что я хочу, это иметь стандартную функциональность поиска в моем собственном NSSearchField. Это возможно?

Бьюсь об заклад, я не первый, кто не доволен нормальным findBar.

Ваша помощь очень нужна и ценится!

2 ответа

Для NSTextView NSTextFinder в основном представляет собой просто пользовательский интерфейс для диапазона функций NSString (из searchString: String, маски параметров: NSString.CompareOptions = [], rangerangeOfReceiverToSearch: NSRange) -> NSRange

Если вы хотите реализовать свой собственный поиск в NSTextView, используйте его. Для поиска вперед вы создаете диапазон, начинающийся с конца диапазона текущего выбора и идущий к концу текста NSTextView. Для поиска в обратном направлении создайте диапазон, начинающийся с 0 и идущий к началу диапазона текущего выбора, и сообщите NSString, чтобы использовать поиск в обратном направлении.

Если NSString возвращает.notFoundдиапазон, реализовать обертывание самостоятельно.

Если тебе надоstartsWith,endsWithилиwholeWordвам нужно будет взять результат, который дает функция NSString, проверить, будет ли он работать, а если нет, настроить диапазон и вызвать его снова.

Ты можешь использовать NSComboBox, Возврат поискового значения с использованием ниже делегата:

- (NSString *)comboBox:(NSComboBox *)aComboBox completedString:(NSString *)substring
{    
    if ([aComboBox tag] == 101 || [aComboBox tag] == 102) {
        NSArray *currentList;
        if ([aComboBox tag] == 101) {
            NSArray *keyArray = keySuggestions;
            currentList = keyArray;
        } else {
            currentList = [NSArray arrayWithArray:self.valueSuggestions];
        }
        NSEnumerator *theEnum = [currentList objectEnumerator];
        id eachString;
        NSInteger maxLength = 0;
        NSString *bestMatch = @"";
        while (nil != (eachString = [theEnum nextObject])) {
            NSString *commonPrefix = [eachString
                                      commonPrefixWithString:substring options:NSCaseInsensitiveSearch];
            if ([commonPrefix length] >= [substring length] && [commonPrefix
                                                                length] > maxLength)
            {
                maxLength = [commonPrefix length];
                bestMatch = eachString;
                break;
            }
        }
        return bestMatch;
    }

    return substring;
}
Другие вопросы по тегам