UISearchController 不要在前面推 viewcontroller 但在 UISearchController 下面
UISearchController don't push viewcontroller on front but below UISearchController
自动呈现 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 下方。
您以错误的方式呈现搜索控制器。查看部分文档。
You use a search controller in tandem with your existing view
controllers. When you have a view controller with searchable content,
incorporate the search bar of a UISearchController object into your
view controller’s interface. When the user interacts with that search
bar, the search controller automatically displays a new view
controller with the search results that you specify.
而不是你的主控制器中的这个:
[self presentViewController:searchController animated:YES completion:nil];
你应该在 iOS 11:
self.definesPresentationContext = YES;
self.navigationItem.searchController = searchController;
或者这个在 iOS 11 之前:
self.definesPresentationContext = YES;
self.navigationItem.titleView = searchController.searchBar;
或者将 searchController.searchBar
放置在您呈现的视图层次结构中的任何其他位置。
您还应该在 viewDidLoad
之类的地方设置搜索控制器,而不是在按下按钮时。
并且您在 ArticleSearchViewController
中获取对 navigationController
的引用的方式必须更新为:
[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
这是一个更好的答案:
definesPresentationContext = true
把这个写在你的MyViewController
自动呈现 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 下方。
您以错误的方式呈现搜索控制器。查看部分文档。
You use a search controller in tandem with your existing view controllers. When you have a view controller with searchable content, incorporate the search bar of a UISearchController object into your view controller’s interface. When the user interacts with that search bar, the search controller automatically displays a new view controller with the search results that you specify.
而不是你的主控制器中的这个:
[self presentViewController:searchController animated:YES completion:nil];
你应该在 iOS 11:
self.definesPresentationContext = YES;
self.navigationItem.searchController = searchController;
或者这个在 iOS 11 之前:
self.definesPresentationContext = YES;
self.navigationItem.titleView = searchController.searchBar;
或者将 searchController.searchBar
放置在您呈现的视图层次结构中的任何其他位置。
您还应该在 viewDidLoad
之类的地方设置搜索控制器,而不是在按下按钮时。
并且您在 ArticleSearchViewController
中获取对 navigationController
的引用的方式必须更新为:
[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
这是一个更好的答案:
definesPresentationContext = true
把这个写在你的MyViewController