2017-10-18 4 views
1

내장 검색 막대를 사용하지 않고 NSTextView에서 "찾기"작업을하고 싶습니다. 프로그래밍 방식으로 검색 문자열을 설정하고 결과를 텍스트보기 내에서 강조 표시하려면 어떻게합니까?NSTextFinder를 프로그래밍 방식으로 사용하는 방법은 무엇입니까?

이것은 macOS 10.12 이상을위한 것입니다.

FWIW이이 질문의 중복되지 않습니다 : NSTextFinder set search string and clear visual feedback programatically

그 질문에 대한 프로그래밍 검색 바의 UI를 제어하거나 이전 찾기 결과를 삭제하거나 찾기 표시 줄 검색 필드를 채우는된다.

이 질문은 검색 막대 UI를 사용하지 않고 프로그래밍 방식으로 "찾기"작업을 호출하는 것과 관련되어 있습니다.

+0

가능한 중복 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 
([NSTextFinder 검색 문자열과 프로그래밍 방식을 시각적으로 명확하게 피드백을 설정]의
+0

감사합니다. 이것은 나를 올바른 방향으로 인도 해 주었고 이제는 그걸 가지고 놀 수 있습니다. findField를 찾기 위해 재귀 적으로 findBar를 검색하는 일은 발생하지 않았습니다. 'NSTextFinderAction'' NSTextFinderActionSetSearchString'이 무엇을하는지 알고 있습니까? 검색 문자열을 설정하는 방법이라고 생각했지만 검색 문자열을 인수로 제공하는 방법을 알 수 없었습니다. – sam

+0

'NSTextFinderActionSetSearchString'은 찾기에 선택 사용 (Command-E)을 사용합니다. – Willeke

관련 문제