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.

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


person UJey    schedule 13.07.2014    source источник
comment
Обратите внимание, что создать собственный SearchField не проблема. Я застрял в реализации механизма поиска для NSTextView, который позволил бы использовать мой пользовательский SearchField.   -  person UJey    schedule 25.07.2014
comment
Вы когда-нибудь догадывались об этом?   -  person sam    schedule 06.10.2017
comment
Неа. В итоге использовал панель поиска по умолчанию. Но придется вернуться к этому обратно довольно скоро.   -  person UJey    schedule 06.10.2017
comment
Вы можете найти это полезным. stackoverflow.com/questions /46817490/   -  person sam    schedule 24.10.2017


Ответы (1)


Вы можете использовать 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;
}
person prabhu    schedule 24.07.2014
comment
Спасибо. Но это не ответ на мой вопрос. Проблема не в SearchField. Я хочу реализовать простой способ поиска TextView с помощью моего пользовательского поля поиска. Было бы неплохо использовать NSTextFinder. Но если это невозможно, предоставьте другое рабочее решение. - person UJey; 25.07.2014