2013-03-17 2 views
0

У меня есть 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;  
} 

Нормальные таблица показывает просто отлично, а также их подробные виды.

+0

Можете ли вы опубликовать методы источника данных. Что-то может с ними не так. numberOfRows: может возвращать фактический счет объектов, а не отфильтрованных объектов. – nkongara

+0

«Я не могу использовать NSPredicate, потому что кажется, что возвращаемая функция возвращает NSArray, и у меня есть NSMutableArray, который я не могу изменить, потому что я не объявляю объекты статически». Это замечание не имеет смысла. И в любом случае вы можете легко превратить NSArray в NSMutableArray и без накладных расходов. – matt

ответ

1

В ваших методов делегата вы имеете в «numberOfRows»:

if (updatesTableView == self.searchDisplayController.searchResultsTableView) { 

затем в «cellForRowAtIndexPath»:

if (tableView == self.searchDisplayController.searchResultsTableView) { 

Вы сравниваете различные таблицы для определения количества строк, а затем, которые массив для получения данных.

+0

Отлично! Это фиксировало сбой, однако теперь, независимо от того, что я набираю, он возвращает все строки для поиска. Что может быть причиной этого? – Anthony

+0

Отлично! Является ли ваша переменная «updatesTableView» правильно настроена (выходы установлены в построителе интерфейса) или назначена в viewDidLoad? – miwic

+0

Таблица загружает данные правильно при загрузке, затем вы попадаете в панель поиска, и она активирует контроллер дисплея, когда вы начинаете вводить его, он просто возвращает все строки обратно в таблицу tableView searchdisplaycontroller.Что заставляет меня думать, что filterContentForSearchText работает неправильно. Но это выглядит хорошо для меня, но я никогда не делал этого раньше. – Anthony

1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [self.filteredItems count]; 
    } else { 
     return [self.items count]; 
    } 
} 
+0

Заменить метод numberOfRowsInSection на этот – Pradeep

Смежные вопросы