6

我有一个带有包含一些文本的 web 视图的 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"];
}
4

3 回答 3

2

在我的测试中,WebView.enclosingScrollView为空。

// [self.textFinderController setFindBarContainer:self.webView.enclosingScrollView];
NSLog(@"%@", self.webView.enclosingScrollView);

使用下面的分类NSView,可以找到扩展的嵌套子视图,NSScrollView并将其设置为容器,让NSTextFinderWebView

@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]];
于 2012-12-03T11:33:19.557 回答
1

终于让这个出现了。

首先将您的 NSTextFinder 实例的客户端设置为实现<NSTextFinderClient>协议的类:

self.textFinder.client = self.textFinderController;

接下来,确保您的 NSTextFinder 将 findBarContainer 设置为 Michael Robinson 描述的 webView 类别,或者自己获取 webView 中的滚动视图:

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

于 2013-08-27T02:03:32.863 回答
1

要显示查找栏(与默认的查找面板相反),您只需使用该setUsesFindBar:方法。

在你的情况下,你会想要做(在你的applicationDidFinishLaunching:aNotification方法中):

[textFinderController setUsesFindBar:YES];
//Optionally, incremental searching is a nice feature
[textFinderController setIncrementalSearchingEnabled:YES];
于 2012-08-16T10:03:17.783 回答