0

자동 프레젠테이션 UISearchController와 다른 검색 컨트롤러 간에는 동작이 다릅니다.UISearchController UISearchController 앞에있는 viewcontroller를 밀어 내지 마십시오. UISearchController 아래에있는

@implementation MyViewComtroller 

// click search barbutton on right of navigationBar 
- (void)searchAction:(id)sender { 
    ArticleSearchViewController *searchResultsController = [[ArticleSearchViewController alloc] init]; 
    UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController]; 
    searchController.searchResultsUpdater = searchResultsController; 
    searchController.searchBar.delegate = searchResultsController; 
    searchController.delegate = searchResultsController; 
    searchController.hidesNavigationBarDuringPresentation = NO; 
    [self presentViewController:searchController animated:YES completion:nil]; 
} 

@end 

@implementation ArticleSearchViewController 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    ArticleDetailController * articleDetailController = [ArticleDetailController new]; 
    [(UINavigationController *)self.presentingViewController pushViewController:articleDetailController animated:YES]; 
} 

@end 

푸시 작업은 UISearchController 아래에서 발생합니다.

+0

SearchResultsControl에 대해 UINavigationController를 설정하면 ler, push action UISearchController에서 happend하지만 searchBar는 animate를 숨길 수 없습니다. – weiminghuaa

답변

1

잘못된 방식으로 검색 컨트롤러를 제공하고 있습니다. 문서의 일부를보십시오.

기존보기 컨트롤러와 함께 검색 컨트롤러를 사용합니다. 검색 가능한 콘텐츠가있는보기 컨트롤러가있는 경우 은 UISearchController 개체의 검색 막대를 보기 컨트롤러의 인터페이스에 통합합니다. 사용자가 해당 검색 막대와 상호 작용할 때 검색 컨트롤러는 지정한 검색 결과를 가진 새보기 컨트롤러를 자동으로 표시합니다.

[self presentViewController:searchController animated:YES completion:nil]; 

당신은 아이폰 OS 11에서이 작업을 수행해야합니다 :

self.definesPresentationContext = YES; 
self.navigationItem.searchController = searchController; 

또는이 사전 아이폰 OS 11 :

self.definesPresentationContext = YES; 
self.navigationItem.titleView = searchController.searchBar; 

를 메인 컨트롤러 대신이의

또는 그 밖의 장소에 searchController.searchBar를 선물하십시오. 뷰 계층 구조.

또한 버튼을 누르지 않고 viewDidLoad과 같은 장소에 검색 컨트롤러를 설정해야합니다.

그리고 당신은 ArticleSearchViewController에서 navigationController이 같은 업데이트해야합니다 당신에 대한 참조를 얻고있다 방법 :

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.view setBackgroundColor:[UIColor blackColor]]; 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    ArticleSearchViewController *searchResultsController = [sb instantiateViewControllerWithIdentifier:@"ArticleSearchViewController"]; 
    UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController]; 
    searchController.searchResultsUpdater = searchResultsController; 
    searchController.searchBar.delegate = searchResultsController; 
    searchController.delegate = searchResultsController; 
    searchController.hidesNavigationBarDuringPresentation = NO; 
// [self presentViewController:searchController animated:YES completion:nil]; //WRONG 
    self.definesPresentationContext = YES; 
    self.navigationItem.searchController = searchController; 
} 

@end 

결과 컨트롤러 : 검색 내용

[self.presentingViewController.navigationController pushViewController:articleDetailController animated:YES]; 

보기 컨트롤러

@implementation ArticleSearchViewController 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UIViewController * articleDetailController = [UIViewController new]; 
    [self.presentingViewController.navigationController pushViewController:articleDetailController animated:YES]; 
} 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { 
    // update appropriately 
} 

@end 
관련 문제