2017-10-18 75 views
1

我想在不使用内置查找栏的情况下在NSTextView中执行“查找”操作。如何以编程方式设置搜索字符串并在文本视图中突出显示结果?如何以编程方式使用NSTextFinder?

这是针对macOS 10.12及更高版本的。

FWIW,这是不是这个问题的一个副本:NSTextFinder set search string and clear visual feedback programatically

这个问题是关于编程控制查找栏UI,无论是以前的结算查找结果或填充查找栏搜索领域。

这个问题是关于调用一个“查找”操作编程方式,根本不使用查找栏用户界面。

+0

的[NSTextFinder设置搜索字符串和编程清晰的视觉反馈](可能的复制https://stackoverflow.com/questions/13839265/nstextfinder-set -search-string-and-clear-visual-feedback-programatically) – Willeke

+0

这不是重复的。请参阅编辑。 – sam

+0

首先设置搜索字符串,然后调用'performAction:'。 – Willeke

回答

1

这里是我的测试代码(哈克,实验组):

@interface ViewController() 

@property (strong) NSTextFinder *textFinder; 
@property (weak) IBOutlet NSTextView *textView; // find Uses Bar, Incremental Searching is on 
@property (weak) NSView *myFindBarView; 
@property (weak) IBOutlet NSView *findBarContainerView; // hidden 
@property BOOL barVisible; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.textFinder = [[NSTextFinder alloc] init]; 
    self.textFinder.incrementalSearchingEnabled = YES; 
    self.textFinder.incrementalSearchingShouldDimContentView = YES; 
    self.textFinder.client = (id<NSTextFinderClient>)self.textView; 
    self.textFinder.findBarContainer = self; 
    [self.textFinder performAction:NSTextFinderActionShowFindInterface]; 
} 

- (IBAction)testSearchString:(id)sender { 
    // action method of a Test button, searches for "found" 
    [self.textFinder cancelFindIndicator]; 

    // search the subviews for a view of class NSSearchField 
    __block __weak NSSearchField *(^weak_findSearchField)(NSView *); 
    NSSearchField *(^findSearchField)(NSView *); 
    weak_findSearchField = findSearchField = ^(NSView *view) { 
     if ([view isKindOfClass:[NSSearchField class]]) 
      return (NSSearchField *)view; 
     __block NSSearchField *foundView = nil; 
     [view.subviews enumerateObjectsUsingBlock:^(NSView *subview, NSUInteger idx, BOOL *stop) { 
      foundView = weak_findSearchField(subview); 
      if (foundView) 
       *stop = YES; 
     }]; 
     return foundView; 
    }; 

    NSSearchField *searchField = findSearchField(self.myFindBarView); 
    [searchField setStringValue:@"found"]; 
    // execute the action of the search field to confirm the new value and do a search 
    [searchField sendAction:searchField.action to:searchField.target]; 
    /* add to select all 
    [self.textFinder performAction:NSTextFinderActionSelectAll]; 
    */ 
} 

// NSTextFinderBarContainer 

- (void)findBarViewDidChangeHeight { 
} 

- (NSView *)findBarView { 
    return self.myFindBarView; 
} 

- (void)setFindBarView:(NSView *)theView { 
    self.myFindBarView = theView; 
    if (theView) { 
     NSRect frame = theView.frame; 
     frame.size.width = self.findBarContainerView.bounds.size.width; 
     theView.frame = frame; 
     [self.findBarContainerView addSubview:theView]; 
    } 
} 

- (NSView *)contentView { 
    return self.textView.enclosingScrollView.contentView; 
} 

- (BOOL)isFindBarVisible { 
    return self.barVisible; 
} 

- (void)setFindBarVisible:(BOOL)theVisible { 
    self.barVisible = theVisible; 
} 

@end 
+0

谢谢。这让我指出了正确的方向,现在我可以玩弄它。我没有想到为了填充它而递归搜索searchFar的searchField。你知道'NSTextFinderAction' NSTextFinderActionSetSearchString吗?我认为这是设置搜索字符串的方式,但无法弄清楚如何提供搜索字符串作为参数。 – sam

+0

'NSTextFinderActionSetSearchString'确实使用选择(Command-E)。 – Willeke

相关问题