2012-05-07 10 views
5

Tengo una aplicación Mac Cocoa con una vista web que contiene algo de texto. Me gustaría buscar a través de ese texto usando la barra de búsqueda predeterminada proporcionada por NSTextFinder. Tan fácil como parece leer a través de la referencia de clase NSTextFinder, no puedo mostrar la barra de búsqueda. ¿Qué me estoy perdiendo?¿Cómo puedo obtener NSTextFinder para mostrar

Como comentario:
- Sí, he intentado establecer findBarContainer a un punto de vista diferente, lo mismo. Me volvió de nuevo a la vista de desplazamiento para eliminar la complejidad en la depuración de
- performTextFinderAction está llamada a realizar la operación de búsqueda

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

Me encontré con esta pregunta mientras buscaba si webview puede ser paierd con un NSTextFinder. Hasta donde puedo ver, esto resuelve un problema más fácil donde el texto en la vista web es simple. La discusión sobre el problema más general está en http: //www.cocoabuilder.com/archive/cocoa/327153-webview-find-panel-bar-implementation.html y http://stackoverflow.com/questions/4601671/how-to-i-highlight-search-results-in-a-webview- like-safari-and-nstextview-showfi – Nickolay

Respuesta

1

Para obtener el Encuentra que aparezca Bar (en contraposición a los valores predeterminados Encuentra Panel), sólo tiene para usar el método setUsesFindBar:.

En su caso, usted querrá hacer (en su método applicationDidFinishLaunching:aNotification):

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

sry para tomar para siempre para responder. Desafortunadamente 'setUsesFindBar' es solo un método en NSTextView. – Lukasz

2

En mis pruebas, WebView.enclosingScrollView era nula.

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

Usando la siguiente categoría en NSView, es posible encontrar la subvista anidada que se extiende NSScrollView, y establece que a medida que el contenedor, permitiendo que el NSTextFinder para visualizar en un bonito 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 

Y en su applicationDidFinishLaunching:aNotification:

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

La razón por la que no hay vista de desplazamiento adjunta es porque es una característica exclusiva de UIWebView (iOS). –

+0

Cuando configuro findBarContainer en la vista de desplazamiento de WebView, findBarView de la vista de desplazamiento sigue siendo nulo y no se muestra cuando establezco findBarVisible en YES. ¿Alguna idea de por qué? – JuJoDi

1

finalmente obtuvo este aparezca.

primer conjunto de clientes instancias NSTextFinder a una clase que implementa la <NSTextFinderClient> protocolo:

self.textFinder.client = self.textFinderController; 

A continuación, asegúrese de que su NSTextFinder tiene una findBarContainer establece en la categoría web View descrito por Michael Robinson, o conseguir la ScrollView dentro la web View mismo:

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

establecer la posición de barra de búsqueda por encima del contenido (o dondequiera que usted desee):

[self.webView scrollView].findBarPosition = NSScrollViewFindBarPositionAboveContent; 

Por último, decirle que se mostrará:

[self.textFinder performAction:NSTextFinderActionShowFindInterface]; 

debe aparecer en su web View:

Además, no estoy seguro si se hace una diferencia, pero no tengo la NSTextFinder en el XI ter, con una toma de referencia:

@property (strong) IBOutlet NSTextFinder *textFinder; 

también puede ser capaz de conseguirlo simplemente Initing que como normal: self.textFinder = [[NSTextFinder alloc] init];

Cuestiones relacionadas