我有一个带有webview的mac cocoa应用程序,其中包含一些文本。我想使用NSTextFinder提供的默认查找栏搜索该文本。虽然这看起来很容易通过NSTextFinder类引用读取,但我无法显示查找栏。我错过了什么?
作为旁注:
- 是的,我尝试将findBarContainer设置为不同的视图,同样的事情。我回到滚动视图以消除调试的复杂性
- 调用performTextFinderAction来执行查找操作
**App Delegate:**
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.textFinderController = [[NSTextFinder alloc] init];
self.webView = [[STEWebView alloc] initWithFrame:CGRectMake(0, 0, self.window.frame.size.width, 200)];
[[self.window contentView] addSubview:self.webView];
[self.textFinderController setClient:self.webView];
[self.textFinderController setFindBarContainer:self.webView.enclosingScrollView];
[[self.webView mainFrame] loadHTMLString:@"sample string" baseURL:NULL];
}
- (IBAction)performTextFinderAction:(id)sender {
[self.textFinderController performAction:[sender tag]];
}
**STEWebView**
@interface STEWebView : WebView <NSTextFinderClient>
@end
@implementation STEWebView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
}
- (NSUInteger) stringLength {
return [[self stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"] length];
}
- (NSString *)string {
return [self stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];
}
答案 0 :(得分:2)
在我的测试中,WebView.enclosingScrollView
为空。
// [self.textFinderController setFindBarContainer:self.webView.enclosingScrollView];
NSLog(@"%@", self.webView.enclosingScrollView);
在NSView
上使用以下类别,可以找到扩展NSScrollView
的嵌套子视图,并将其设置为容器,从而允许NSTextFinder
在WebView
内精美显示{1}}
@interface NSView (ScrollView)
- (NSScrollView *) scrollView;
@end
@implementation NSView (ScrollView)
- (NSScrollView *) scrollView {
if ([self isKindOfClass:[NSScrollView class]]) {
return (NSScrollView *)self;
}
if ([self.subviews count] == 0) {
return nil;
}
for (NSView *subview in self.subviews) {
NSView *scrollView = [subview scrollView];
if (scrollView != nil) {
return (NSScrollView *)scrollView;
}
}
return nil;
}
@end
在您的applicationDidFinishLaunching:aNotification
:
[self.textFinderController setFindBarContainer:[self scrollView]];
答案 1 :(得分:1)
要显示查找栏(与默认的“查找面板”相对),您只需使用setUsesFindBar:
方法。
在您的情况下,您需要(使用applicationDidFinishLaunching:aNotification
方法):
[textFinderController setUsesFindBar:YES];
//Optionally, incremental searching is a nice feature
[textFinderController setIncrementalSearchingEnabled:YES];
答案 2 :(得分:1)
终于让它出现了。
首先将NSTextFinder实例的客户端设置为实现<NSTextFinderClient>
协议的类:
self.textFinder.client = self.textFinderController;
接下来,确保您的NSTextFinder将findBarContainer设置为Michael Robinson描述的webView类别,或者自己在webView中获取scrollview:
self.textFinder.findBarContainer = [self.webView scrollView];
将查找栏位置设置在内容上方(或任何您想要的位置):
[self.webView scrollView].findBarPosition = NSScrollViewFindBarPositionAboveContent;
最后,告诉它出现:
[self.textFinder performAction:NSTextFinderActionShowFindInterface];
它应该出现在你的webView中:
另外,不确定它是否有所作为,但我在XIB中有NSTextFinder,带有引用插座:
@property (strong) IBOutlet NSTextFinder *textFinder;
您也可以通过简单地启动它来获取它:self.textFinder = [[NSTextFinder alloc] init];