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;
}