我正在尝试使用来自我的自定义NSSearchField的搜索查询在NSTextView中实现搜索。
听起来很简单,但我无法让它发挥作用。
到目前为止,我已查看了有关NSTextFinder
及其客户端和FindBarContainer的所有Apple文档。 TextFinder只是向容器提供FindBarView,容器在激活搜索时显示它。
隐藏客户端,容器和TextFinder之间的所有通信。它看起来像一个黑盒子,设计为“按原样”工作,没有任何定制或干扰。
但是NSTextFinder的- (void)performAction:(NSTextFinderAction)op
方法呢?是不是将自定义命令发送到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不满意的人。
非常需要你的帮助!
答案 0 :(得分:0)
您可以使用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;
}