Created
July 20, 2012 09:21
-
-
Save Eric-Bro/3149836 to your computer and use it in GitHub Desktop.
[UI/NS]TextView old-school search
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// textView - ваш NSTextView | |
// NSString *search_query - {глобальная переменная/член класса} | |
// строка, которую вам нужно найти | |
// NSRange result_range - {глобальная переменная/член класса} | |
// последние результаты поиска | |
// BOOL backwards_search - {глобальная переменная/член класса} | |
// поиск в обратном направлении? | |
// | |
/* "Главный" метод */ | |
- (void)searchString:(NSString *)query | |
{ | |
/* | |
Ищем ли мы новую строку | |
или следующее/предыдущее вхождение предыдущей? | |
*/ | |
if (! [query isEqualToString: search_query]) { | |
search_query = query; | |
[self initialSearch]; | |
} else { | |
[self continueSearch]; | |
} | |
} | |
- (void)initialSearch | |
{ | |
result_range = [textView.text rangeOfString: search_query | |
options: NSCaseInsensitiveSearch | (backwards_search * NSBackwardsSearch) | |
range: NSMakeRange(0, [textView.text length])]; | |
[self showResults]; | |
} | |
- (void)showResults | |
{ | |
if (result_range.location == NSNotFound ) { | |
// не найдено | |
NSBeep(); | |
NSLog(@"No such <%@> there", search_query); | |
search_query = nil; | |
} else { | |
// выделяем подстроку, пишем в лог, etc | |
NSLog(@"Found it at %d:%d", result_range.location, result_range.length); | |
} | |
} | |
- (void)continueSearch | |
{ | |
BOOL can_perform_search = NO; | |
if (backwards_search && (result_range.location - result_range.length > 0)) | |
{ | |
result_range.length = result_range.location; | |
result_range.location = 0; | |
++can_perform_search; | |
} else if (!backwards_search && (result_range.location + result_range.length <= [textView.text length])) { | |
result_range.location += result_range.length; | |
result_range.length = [textView.text length] - result_range.location; | |
++can_perform_search; | |
} | |
if (can_perform_search) { | |
result_range = [textView.text rangeOfString: search_query | |
options: NSCaseInsensitiveSearch | (backwards_search * NSBackwardsSearch) | |
range: result_range]; | |
[self showResults]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment