2012-05-07 2 views
5

У меня есть приложение mac cocoa с веб-просмотром, содержащим некоторый текст. Я хотел бы найти этот текст, используя панель поиска по умолчанию, предоставляемую NSTextFinder. Так легко, как это может показаться, прочитав ссылку на 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

Я наткнулся на этот вопрос во время поиска, если webview может быть paierd с помощью NSTextFinder. Насколько я вижу, это решает более легкую проблему, когда текст в веб-просмотре прост. Обсуждение более общей проблемы находится на http: //www.cocoabuilder.com/archive/cocoa/327153-webview-find-panel-bar-implementation.html и http://stackoverflow.com/questions/4601671/how-to-i-highlight-search-results-in-a-webview- like-safari-and-nstextview-showfi – Nickolay

ответ

1

Чтобы получить Найти появляться Bar (в отличие от по умолчанию Найти Panel), вы просто для использования метода setUsesFindBar:.

В вашем случае, вы хотите сделать (в методе applicationDidFinishLaunching:aNotification):

[textFinderController setUsesFindBar:YES]; 
//Optionally, incremental searching is a nice feature 
[textFinderController setIncrementalSearchingEnabled:YES]; 
+2

sry для принятия навсегда ответа. К сожалению, setUsesFindBar - это только метод NSTextView. – Lukasz

2

В моих тестах WebView.enclosingScrollView был нулевым.

// [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]]; 
+2

Причина, по которой нет прокрутки, заключается в том, что это только функция UIWebView (iOS). –

+0

Когда я устанавливаю findBarContainer в прокрутку просмотра WebView, поиск FindBarView прокрутки по-прежнему остается нулевым, и он не отображается, когда я устанавливаю findBarVisible в YES. Любая идея почему? – JuJoDi

1

Наконец-то это появилось.

Сначала установите клиент ваших NSTextFinder экземпляры к классу реализации <NSTextFinderClient> протокола:

self.textFinder.client = self.textFinderController; 

Далее, убедитесь, что ваш NSTextFinder имеет findBarContainer набор к категории WebView, описываемого Майкл Робинсон, или получить Scrollview в Webview себя:

self.textFinder.findBarContainer = [self.webView scrollView]; 

Установите положение панели поиска над содержанием (или там, где вы хотите):

[self.webView scrollView].findBarPosition = NSScrollViewFindBarPositionAboveContent; 

Наконец, скажи, чтобы показать:

[self.textFinder performAction:NSTextFinderActionShowFindInterface]; 

Он должен отображаться в WebView:

Кроме того, не уверен, если это имеет значение, но у меня есть NSTextFinder в XIB, с ссылающегося выхода:

@property (strong) IBOutlet NSTextFinder *textFinder; 

Вы также можете быть в состоянии получить это просто initing его как обычно: self.textFinder = [[NSTextFinder alloc] init];

Смежные вопросы