2013-06-28 2 views
2

Добрый день,reloadData не работает (называемые в делегатом)

Я использую UITableViewController для отображения поиска предметов.

Мой код выглядит следующим образом ниже: Проблема заключается в том, когда я называю GETSEARCH функцию в моей viewDidLoad, он работает и выполняет функцию обратного вызова TITLEITEMSRETURNED. И таблица стола правильно загружает.

Однако, если я использую поисковую панель и выполните GETSEARCH. делегат вызывается, данные загружаются в массив правильно, но tableView никогда не обновляется.

Однако, если я нажму кнопку серого креста, таблица внезапно обновится !!? Что дает?

-(void)TitleItemsReturned:(NSArray*)titleItems{ 
    for(TitleItem* titleItem in titleItems){ 
     // NSLog(@"TITLE: %@ ISBN: %@",titleItem.Title,titleItem.ISBN); 
     [searchResults addObject:titleItem]; 
    } 
    [self.tableView reloadData]; 
} 

- (void)viewDidLoad 
{ 
    NSLog(@"RUN"); 
    networkLayer=[[NLBNetworkLayer alloc]init]; 
    searchResults=[[NSMutableArray alloc]initWithCapacity:500]; 
// [networkLayer getBookSearch:TITLE term:@"Inferno"]; 
    [super viewDidLoad]; 
} 

-(void)viewDidAppear:(BOOL)animated{ 
    [networkLayer setDelegate:(id)self]; 
} 


#pragma mark - Table view data source 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    TitleItem *titleItem = nil; 
    titleItem = [searchResults objectAtIndex:indexPath.row]; 
// Configure the cell 
    cell.textLabel.text = titleItem.Title; 
    NSLog(@"called %@",titleItem.Title); 
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 
    return cell; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"count %d",[searchResults count]); 
    return [searchResults count]; 
} 

#pragma mark - UISearchDisplayController Delegate Methods 
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller  shouldReloadTableForSearchString:(NSString *)searchString { 
    return YES; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{ 
    //[networkLayer getBookSearch:TITLE term:searchBar.text]; 
    [networkLayer getBookSearch:TITLE term:@"Inferno"]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    NSLog(@"all removed"); 
    [searchResults removeAllObjects]; 
    [self.tableView reloadData]; 
} 
+0

Вы уверены, что после поиска завершена перезагрузка таблицы? – Ganapathy

+0

Можете ли вы показать мне ваш метод getBookSearch в сетевом сервере? – wesley

ответ

4

Убедитесь, что вы отправляете reloadData сообщение от основного потока, иначе могут возникнуть проблемы. Похоже, что метод TitleItemsReturned не может быть вызван из основного потока (например, из фонового потока в методе NSURLConnectionDelegate, реализованного объектом networkLayer или аналогичным методом делегата).

Если TitleItemsReturned действительно не выполняется на главном потоке, вы можете сделать это внутри TitleItemsReturned:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 

Метод searchBarCancelButtonClicked работает потому, что метод работает в основном потоке (от события пользовательского интерфейса).