自动表示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下面。
发布于 2018-01-20 09:58:19
您以错误的方式呈现搜索控制器。请看文档的一部分。
您可以同时使用搜索控制器和现有的视图控制器。当您有一个具有可搜索内容的视图控制器时,将UISearchController对象的搜索栏合并到视图控制器的接口中。当用户与该搜索栏交互时,搜索控制器将自动显示一个新的视图控制器和您指定的搜索结果。
而不是在主控制器中这样做:
[self presentViewController:searchController animated:YES completion:nil]; 您应该在iOS 11上这样做:
self.definesPresentationContext = YES;
self.navigationItem.searchController = searchController;或者在pre iOS 11上:
self.definesPresentationContext = YES;
self.navigationItem.titleView = searchController.searchBar;或者将searchController.searchBar放置在所呈现的视图层次结构中的任何其他位置。
您还应该在像viewDidLoad这样的地方设置搜索控制器,而不是按下按钮。
您在ArticleSearchViewController中获取对您的ArticleSearchViewController的引用的方式必须更新为以下内容:
[self.presentingViewController.navigationController pushViewController:articleDetailController animated:YES];具有可搜索内容的视图控制器:
@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结果主计长:
@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发布于 2020-04-20 18:23:51
这是一个更好的答案:
definesPresentationContext = true把这个写在你的MyViewController里
https://stackoverflow.com/questions/42855378
复制相似问题