У меня есть UISearchDisplayController в UITableView. UITableView захватывает данные JSON с сервера, разбивает его, и класс объекта принимает эти данные и создает объекты. Он добавляет объекты в массив Mutable, чтобы затем использовать в качестве источника данных для таблицы.Ошибка массива за пределами ошибки при использовании UISearchDisplayController
Существует также другой Mutable массив, используемый в качестве фильтрованных объектов.
Он заявил так:
self.filteredItems = [NSMutableArray arrayWithCapacity:[self.items count]];
При попытке поиска в таблице я получаю эту ошибку:
Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
Это код, я использую, чтобы сделать фильтрацию, которую я найденный после прохождения кучу учебников, я не могу использовать NSPredicate, потому что кажется, что возвращаемая функция возвращает NSArray, и у меня есть NSMutableArray, который я не могу изменить, потому что я не объявляю объекты статически.
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
/*
Update the filtered array based on the search text and scope.
*/
[self.filteredItems removeAllObjects];
for (Update *update in items)
{
if ([scope isEqualToString:@"Serial Number"]) {
NSComparisonResult result = [[update Serial_Number] compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame){
[filteredItems addObject:update];
}
} else if ([scope isEqualToString:@"Ticket Number"]) {
NSComparisonResult result = [[update Ticket_Number] compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame){
[filteredItems addObject:update];
}
} else if ([scope isEqualToString:@"Customer"]) {
NSComparisonResult result = [[update Customer] compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame){
[filteredItems addObject:update];
}
}
}
}
Не слишком уверен, что я делаю неправильно, я никогда не пытался реализовать этот контроль раньше.
Я на самом деле выполнил точки останова, я вижу, что объекты добавляются в фильтрованный массив, но затем он неожиданно падает.
Если вам нужна любая другая часть кода, которая поможет мне, пожалуйста, сообщите мне.
Спасибо!
Edit:
Вот методы делегата:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if (updatesTableView == self.searchDisplayController.searchResultsTableView) {
return [self.filteredItems count];
} else {
return [self.items count];
}
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
Update *update = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
update = [filteredItems objectAtIndex:indexPath.row];
} else {
// Configure the cell...
update = [items objectAtIndex:indexPath.row];
}
[[cell textLabel] setText:[update Serial_Number]];
[[cell detailTextLabel] setText:[NSString stringWithFormat:@"Customer: %@", [update Customer]]];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
Нормальные таблица показывает просто отлично, а также их подробные виды.
Можете ли вы опубликовать методы источника данных. Что-то может с ними не так. numberOfRows: может возвращать фактический счет объектов, а не отфильтрованных объектов. – nkongara
«Я не могу использовать NSPredicate, потому что кажется, что возвращаемая функция возвращает NSArray, и у меня есть NSMutableArray, который я не могу изменить, потому что я не объявляю объекты статически». Это замечание не имеет смысла. И в любом случае вы можете легко превратить NSArray в NSMutableArray и без накладных расходов. – matt