2012-05-07 20 views
5

Tôi có ứng dụng ca cao mac với chế độ xem web có chứa một số văn bản. Tôi muốn tìm kiếm thông qua văn bản đó bằng thanh tìm kiếm mặc định do NSTextFinder cung cấp. Dễ như điều này có vẻ như đọc qua tham chiếu lớp NSTextFinder, tôi không thể nhận được thanh tìm kiếm hiển thị. Tôi đang thiếu gì?Làm cách nào để nhận NSTextFinder hiển thị

Làm phụ trang:
- Có, tôi đã thử đặt findBarContainer thành một chế độ xem khác, cùng một điều. Tôi trở lại con người xem di chuyển để loại bỏ sự phức tạp trong việc gỡ lỗi
- performTextFinderAction được gọi để thực hiện các hoạt động tìm

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

Tôi đã vấp vào câu hỏi này trong khi tìm kiếm xem webview có thể là paierd với NSTextFinder hay không. Theo như tôi thấy, điều này giải quyết một vấn đề dễ dàng hơn khi văn bản trong chế độ xem web đơn giản. Cuộc thảo luận về vấn đề chung hơn là tại http: //www.cocoabuilder.com/archive/cocoa/327153-webview-find-panel-bar-implementation.html và http://stackoverflow.com/questions/4601671/how-to-i-highlight-search-results-in-a-webview- like-safari-and-nstextview-showfi – Nickolay

Trả lời

1

Để có được Find Bar xuất hiện (như trái ngược với mặc định Tìm Panel), bạn chỉ cần có để sử dụng phương thức setUsesFindBar:.

Trong trường hợp của bạn, bạn sẽ muốn làm (trong phương pháp applicationDidFinishLaunching:aNotification của bạn):

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

cố gắng hết sức để trả lời. Thật không may 'setUsesFindBar' chỉ là một phương thức trên NSTextView. – Lukasz

2

Trong các thử nghiệm của tôi, WebView.enclosingScrollView là null.

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

Sử dụng danh mục sau trên NSView, người ta có thể tìm ra subview lồng nhau mà kéo dài NSScrollView, và thiết lập đó là container, cho phép NSTextFinder để hiển thị đẹp mắt trong vòng một 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 

Và trong số applicationDidFinishLaunching:aNotification:

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

Lý do không có scrollview kèm theo là bởi vì đó là một tính năng chỉ UIWebView (iOS). –

+0

Khi tôi thiết lập findBarContainer cho chế độ xem cuộn của WebView, findBarView của khung nhìn cuộn vẫn còn rỗng và nó không được hiển thị khi tôi đặt findBarVisible thành YES. Bất kỳ ý tưởng tại sao? – JuJoDi

1

Cuối cùng, điều này sẽ hiển thị.

Đầu tiên đặt ứng dụng khách hợp NSTextFinder của bạn đến một lớp học thực hiện <NSTextFinderClient> giao thức:

self.textFinder.client = self.textFinderController; 

Tiếp theo, hãy chắc chắn NSTextFinder của bạn có một findBarContainer thiết lập để loại WebView mô tả bởi Michael Robinson, hoặc lấy scrollview trong vòng WebView mình:

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

Đặt vị trí thanh tìm trên nội dung (hoặc bất cứ nơi nào bạn muốn):

[self.webView scrollView].findBarPosition = NSScrollViewFindBarPositionAboveContent; 

Cuối cùng, hãy cho nó hiển thị:

[self.textFinder performAction:NSTextFinderActionShowFindInterface]; 

Nó sẽ hiện lên trong WebView của bạn:

Ngoài ra, không chắc chắn nếu nó làm cho một sự khác biệt, nhưng tôi có NSTextFinder trong XIB, với một cửa hàng tham khảo:

@property (strong) IBOutlet NSTextFinder *textFinder; 

Bạn cũng có thể có được nó bằng cách đơn giản initing nó như bình thường: self.textFinder = [[NSTextFinder alloc] init];

Các vấn đề liên quan