Я бы хотел добавить функцию поиска к TableView
в моем приложении.Я заполняю таблицу с NSArray
, который имеет x
количество Objects
, которое содержит 3 NSStrings
.Вот как я создаю это NSArray
:
Сначала я создаю класс Code.h
:
#import <Foundation/Foundation.h>
@interface Code : NSObject
@property (nonatomic, strong) NSString *codeName;
@property (nonatomic, strong) NSString *codeNumber;
@property (nonatomic, strong) NSString *codeDesc;
@end
Затем я синтезирую эти NSStrings
в Code.m
.
Теперь в моем SearchViewController.m
, вот как я создаю свой набор данных:
NSMutableArray *codes;
codes = [[NSMutableArray alloc] init];
Code *c = [[Code alloc] init];
[c setCodeNumber:@"1"];
[c setCodeName:@"First Title Here"];
[c setCodeDesc:@"I might write a desc in here."];
[codes addObject:c];
c = [[Code alloc] init];
[c setCodeNumber:@"2"];
[c setCodeName:@"Second Title Here"];
[c setCodeDesc:@"2nd desc would be written here."];
[codes addObject:c];
и так далее ...
Вот как я его отображаю: cellForRowAtIndexPath
:
Code *c = [codes objectAtIndex:indexPath.row];
NSString *fused = [NSString stringWithFormat:@"%@ - %@",[c codeNumber],[c codeName]];
cell.textLabel.text = fused;
return cell;
Итак, теперь, когда вы знаете, как структурированы и отображаются мои данные, у вас есть представление о том, как искать NSArray
или, возможно (предпочтительно) TableCells
, которые уже были созданы?
Я прошел через несколько онлайн-уроков, касающихся Adding a Search Bar to a TableView
, но все они написаны для использования настройки массивов с использованием простого arrayWithObjects
.
SIDETHOUGHT: Можно ли мне построить arrayWithObjects:@"aaa-1",@"bbb-2",@"ccc-3"...
из моих данных?Если мне удастся справиться с этим, я смогу использовать эти учебники для заполнения своих ячеек и их поиска!
ОБНОВЛЕНИЕ:
Ваш второй ответ имеет для меня больше смысла!Спасибо за это.Я полагаю, что выполнил вашу инструкцию, но я получаю "- [Поиск кода:]: нераспознанный селектор, отправленный на экземпляр 0x6a2eb20`, когда эта строка нажата.
- Я добавил
@property (nonatomic, strong) NSString *searchString;
к Code.h
и синтезировал его в Code.m
- Я добавил
NSMutableSet *searchResults;
к SearchViewController.h
* @interface
- Я добавил ваши методы
performSearchWithString
и matchFound
к SearchViewController.m
- Непосредственно под теми, кого я добавил, чтобы вызвать
performSearchWithString
x
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchString {
NSLog(@"%@",searchString); //Just making sure searchString is set
[self performSearchWithString:searchString];
[self.tableView reloadData];
}
Ошибка срабатывает при запуске [codes makeObjectsPerformSelector:@selector(search:) withObject:self];
. Я запутался b /c похоже, что Code не распознает searchString, но я знаю, что добавил его в Code.h.
ОБНОВЛЕНИЕ: чтобы хранить объекты в searchResults
, мне пришлось заменить searchResults
на NSMutableSet
в NSMutableArray
и измените - (void)matchFound:(Code *) matchingCode {}
на это:
-(void) matchFound:(Code *) matchingCode {
Code *match = [[Code alloc] init];
if (searchResults.count == 0) {
searchResults = [[NSMutableArray alloc] init];
[match setCodeName:[matchingCode codeName]];
[match setCodeNumber:[matchingCode codeNumber]];
[match setCodeDesc:[matchingCode codeDesc]];
[searchResults addObject:match];
}
else
{
match = [[Code alloc] init];
[match setCodeName:[matchingCode codeName]];
[match setCodeNumber:[matchingCode codeNumber]];
[match setCodeDesc:[matchingCode codeDesc]];
[searchResults addObject:match];
}
С несколькими другими твиками у меня есть рабочая панель поиска для моего tableView. Спасибо, Тим Кемп!
О, я также искал поиск без учета регистра. NSRange rangeName = [codeName rangeOfString: searchString options:NSCaseInsensitiveSearch];
Я надеюсь, что этот вопрос и ответ будут полезны для следующей цели обучения разработчика - cч этот вопрос!