6

テキストを含む 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"];
}
4

3 に答える 3

2

私のテストでWebView.enclosingScrollViewは、null でした。

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

で次のカテゴリを使用するNSViewと、 を拡張するネストされたサブビューを見つけ、それをNSScrollViewコンテナとして設定して、 をNSTextFinder内に美しく表示することができます。WebView

@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 に、Michael Robinson によって説明されている webView カテゴリに設定された findBarContainer があることを確認するか、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 に答える