2016-11-09 3 views
1

저는이 문제로 많은 어려움을 겪고 있습니다. 일부 게시물은이 문제를 다루지 만 내 경우에는 해결책이 없습니다.UISearchController 테이블 뷰 결과가 비어 있습니다.

여기에 문제가 있습니다. UISearchController 메서드로 일부 결과를 표시하고 싶습니다. 사용자 정의 셀이있는 원래의 테이블보기는 모든 항목이 여기에 있으며 원하는대로 표시한다는 의미에서 완벽하게 작동합니다.

범위 막대가있는 검색 창을 사용하면 다시 모든 것이 완벽하게 작동하고 필터링 된 결과가 목록에 올바르게 저장되며 사용자 지정 셀조차도 필요한 모든 것을 얻습니다. 즉 셀을 확인할 때 속성, 그것은 필터링 된 항목에 해당합니다 ...

하지만 내가 어디가는 "새로운"테이블보기 (결과와 함께 하나)가 비어 있다는 의미에서 모든보기가 가득 차 있습니다 빈 줄과 함께) 필터링 된 항목이 여기에 있고 cellForRowAtIndexPath가 (적어도 표시 될 때까지) 작업을 수행하고 있음에도 불구하고.

누군가이를 해결할 수 있도록 도와 줄 수 있습니까?

코드 : 난 당신이 더 많은 코드를 필요로

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { 

    NSPredicate *predicate; 

    NSString *searchText = searchController.searchBar.text; 
    NSInteger scope = searchController.searchBar.selectedScopeButtonIndex; 

    if (scope == 0) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.drugName contains[c] %@", searchText]; 

    } 

    if (scope == 1) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.marque contains[c] %@", searchText]; 

    } 

    else if (scope == 2) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.classFamily contains[c] %@", searchText]; 

    } 

    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:[[[SubstrateStore sharedStore] allSubstrates] filteredArrayUsingPredicate:predicate]]; 
    self.filteredResults = [NSMutableArray arrayWithArray:tempArray]; 

    [self.tableView reloadData]; // -> I tried to remove, to change the table view, etc, it does change anything 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath]; 

    Substrate *substrate = self.products[indexPath.row]; 

    if (_searchController.active && ![_searchController.searchBar.text isEqualToString:@""]) { 

     substrate = self.filteredResults[indexPath.row]; 
    } 

    [self configureCell:cell forProduct:substrate]; // when I check cell attributes (drugName,...), they are there... 

    return cell; // it works when no search is done (with the native table view) but the cell is not displayed when using the search bar (empty table view) 
} 

...

감사합니다!

+0

1인가 도움이되는 경우? 2.'self.filteredResults'가'self.tableView'의 올바른 데이터 소스인지 확신합니까? 3.'[self.tableView reloadData]'를 호출하면,'UITableViewDelegate' 메소드가 호출됩니까? – Ryan

+0

proble은 결과 테이블 뷰 – Trichophyton

답변

0

문제는 searchController의 tableView가 아니라 self.tableView를 다시로드한다는 것입니다.

또한 dataSource를 올바르게 지정하고 searchController의 tableView를 위임자로 위임했는지 확인하십시오.

+0

에 대해 자체 데이터 소스를 설정하는 것을 잊었습니다. 이전에 읽은 것 이었지만 필터링 된 테이블 뷰를 다시로드하려고 시도 할 때도 작동하지 않는 것 같습니다. 아니면 내가 잘못했을 수도 있습니다. 같은 위치에 데이터를 다시로드해야합니까? – Trichophyton

+0

이 메서드로 결과를 표시하는 데 동일한 tableview가 사용되었다는 것을 읽었 기 때문에. searchController의 테이블 뷰를 다시로드하는 것이 어떻게 가능합니까? 나는 다른 테이블 뷰를 만들지 모르겠다. – Trichophyton

+0

두 개의 테이블이있다. VC에 주 테이블이 있는데, 이것은'[self.tableView reload];를 호출하고 searchController에 존재하는 tableView를 가지고 있기 때문에 제대로 업데이트됩니다. searchController.searchResults 또는 이와 유사한 것일 수 있습니다. 해당 방법에 중단 점을 설정하고 메모리 스택을 검사하여 정확한 값을 찾으십시오. searchController에 표시된 빈 테이블에 대한 참조가 있으며 해당 테이블의 데이터를 업데이트하지 않으므로 빈 상태로 남습니다. 결과 테이블보기에서 자체에 대리자/데이터 소스를 지정했는지 확인하십시오. –

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.products = [[SubstrateStore sharedStore] allSubstrates]; 
    self.filteredResults = [[NSArray alloc] init]; 

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 

    // SearchBar 
    _resultsTableController = [[ResultsTableViewController alloc] init]; 
    _searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController]; 
    self.searchController.searchResultsUpdater = self; 
    [self.searchController.searchBar sizeToFit]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    self.searchController.searchBar.showsScopeBar = YES; 
    self.searchController.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"DCI", @"Nom de marque", @"Classe", nil]; 

    // we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables 
    self.resultsTableController.tableView.delegate = self; 
    self.searchController.delegate = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES 
    self.searchController.searchBar.delegate = self; // so we can monitor text changes + others 

    // Search is now just presenting a view controller. As such, normal view controller 
    // presentation semantics apply. Namely that presentation will walk up the view controller 
    // hierarchy until it finds the root view controller or one that defines a presentation context. 
    // 
    self.definesPresentationContext = YES; // know where you want UISearchController to be displayed 

} 

이 좀 더 코드는 당신이`tempArray` 어떤 목적이 있는지 확인

관련 문제