2

良い一日、

UITableViewControllerを使用してSearch Itemsを表示しています。

私のコードとおりです。そして、tableViewは正しくリロードされます。

ただし、検索バーを使用して 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];
}
4

1 に答える 1

5

reloadDataメインスレッドからメッセージを送信していることを確認してください。そうしないと、問題が発生する可能性があります。メソッドがメイン スレッドから呼び出されないようです (たとえば、オブジェクトによって実装されTitleItemsReturnedたメソッドのバックグラウンド スレッド、または同様のデリゲート メソッドから)。NSURLConnectionDelegatenetworkLayer

TitleItemsReturnedが実際にメイン スレッドで実行されていない場合は、次の内部でこれを行うことができTitleItemsReturnedます。

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

そのsearchBarCancelButtonClickedメソッドは (UI イベントから) メイン スレッドで実行されているため、メソッドは機能しています。

于 2013-06-28T17:32:44.047 に答える