2012-05-07 15 views
5

Ho un'applicazione mac cacao con una webview che contiene del testo. Vorrei cercare attraverso quel testo usando la barra di ricerca predefinita fornita da NSTextFinder. Per quanto possa sembrare semplice leggere il riferimento alla classe NSTextFinder, non riesco a far apparire la barra di ricerca. Cosa mi manca?Come faccio a visualizzare NSTextFinder

Come sidenote:
- Sì, ho provato a installare findBarContainer ad una visione diversa, stessa cosa. Sono ritornato indietro alla vista di scorrimento per eliminare la complessità debug
- performTextFinderAction è chiamato a eseguire l'operazione di ricerca

**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

Mi sono imbattuto in questa domanda durante la ricerca se webview può essere paierd con un NSTextFinder. Per quanto posso vedere, questo risolve un problema più semplice in cui il testo nella visualizzazione Web è semplice. La discussione sul problema più generale è su http: //www.cocoabuilder.it/archive/cacao/327153-webview-find-panel-bar-implementation.html e http://stackoverflow.com/questions/4601671/how-to-i-highlight-search-results-in-a-webview- like-safari-and-nstextview-showfi – Nickolay

risposta

1

Per ottenere il Trova barra di apparire (in contrapposizione al default Trova Panel), è sufficiente utilizzare il metodo setUsesFindBar:.

Nel tuo caso, ti consigliamo di fare (nel metodo applicationDidFinishLaunching:aNotification):

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

sry per aver preso per sempre per rispondere. Sfortunatamente 'setUsesFindBar' è solo un metodo su NSTextView. – Lukasz

2

Nel mio test, WebView.enclosingScrollView era nullo.

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

Utilizzando la categoria su NSView, è possibile trovare la visualizzazione secondaria nidificato che si estende NSScrollView, e set che come il contenitore, permettendo al NSTextFinder per visualizzare in modo bello all'interno di un 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 

E nel tuo applicationDidFinishLaunching:aNotification:

[self.textFinderController setFindBarContainer:[self scrollView]]; 
+2

Il motivo per cui non è disponibile una vista per lo scrolling è perché questa è solo una caratteristica di UIWebView (iOS). –

+0

Quando ho impostato findBarContainer sulla vista di scorrimento di WebView, la findBarView della vista di scorrimento è ancora nullo e non viene visualizzata quando si imposta findBarVisible su YES. Qualche idea del perché? – JuJoDi

1

Finalmente questo si è presentato.

primo set cliente le istanze NSTextFinder ad una classe che implementa l'<NSTextFinderClient> protocollo:

self.textFinder.client = self.textFinderController; 

Avanti, assicurarsi che il NSTextFinder ha una findBarContainer impostato alla categoria WebView descritto da Michael Robinson, o ottenere la ScrollView all'interno WebView te stesso:

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

Impostare la posizione di barra di ricerca sopra il contenuto (o dovunque si desidera):

[self.webView scrollView].findBarPosition = NSScrollViewFindBarPositionAboveContent; 

Infine, dire a presentarsi:

[self.textFinder performAction:NSTextFinderActionShowFindInterface]; 

dovrebbe mostrare nel vostro WebView:

Inoltre, non so se si fa la differenza, ma ho la NSTextFinder nel XIB, con una presa di riferimento:

@property (strong) IBOutlet NSTextFinder *textFinder; 

si può anche essere in grado di farlo, semplicemente initing piace normale: self.textFinder = [[NSTextFinder alloc] init];

Problemi correlati