如何将一个 UIStoryboard 场景与 UITableViewController 和 resultsTableViewController 与 UISearchController 一起使用?
How to use one UIStoryboard scene with UITableViewController and resultsTableViewController in concert with UISearchController?
在 iOS 8 中,不推荐使用 UISearchDisplayController,使 UISearchController 可以选择向应用程序添加搜索行为。这迫使开发人员创建一个单独的 UITableviewController 来显示搜索结果——我们将此 tableViewController 称为 resultsTableViewController。此线程中详细介绍了如何从 UISearchDisplayController 迁移到 UISearchController:searchDisplayController deprecated in iOS 8
在我的应用程序中,我使用了 interfacebuilder 和故事板。我的 UITableViewController 是在故事板中自定义的,带有自定义单元格,给了我想要的东西。但是,我希望我的 resultsTableViewController 看起来和我的 tableViewController.
完全一样
问题:有没有办法在故事板中为我的 tableViewController 和 resultsTableViewController 使用相同的场景?
如果不是,最好的解决方法是什么?
这个问题在这里得到了部分回答:How to share one storyboard scene between multiple UIViewControllers,但我还有很长的路要走。
在 Apple 开发者论坛 tartempion 的帮助下,我终于在一个文件中管理了 UTableviewController 和 searchViewController,使我能够使用相同的故事板场景来显示搜索结果。
@interface TableViewController () <UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating>
{
UISearchController *_searchcontroller;
NSArray * myArray;
NSArray * myDisplayedArray;
}
@end
@implementation TableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[...]
_searchcontroller=[[UISearchController alloc]initWithSearchResultsController:nil];
_searchcontroller.searchResultsUpdater =self;
_searchcontroller.dimsBackgroundDuringPresentation=NO;
myDisplayedArray=myArray;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [myDisplayedArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyClass*myInstance =[myDisplayedArray objectAtIndex:[indexPath row]];
//and however you want to configure cells...
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//whatever you need...
//and to get rid of the searchcontroller when you move to the UIView that is connected
self.searchcontroller.active=NO;
//or
[self.searchcontroller dismissViewControllerAnimated:NO completion:nil];
}
#pragma mark -
- (void)updateSearchResultsForSearchController:(UISearchController *)inSearchController
{
if (_searchController==inSearchController)
{
NSString *tSearchText = inSearchController.searchBar.text;
if ([tSearchText length]==0)
{
myDisplayedArray=myArray;
}
else
{
myDisplayedArray=[myArray filteredWithPattern:tSearchText];
}
[self.tableView reloadData];
}
}
@end
在 iOS 8 中,不推荐使用 UISearchDisplayController,使 UISearchController 可以选择向应用程序添加搜索行为。这迫使开发人员创建一个单独的 UITableviewController 来显示搜索结果——我们将此 tableViewController 称为 resultsTableViewController。此线程中详细介绍了如何从 UISearchDisplayController 迁移到 UISearchController:searchDisplayController deprecated in iOS 8
在我的应用程序中,我使用了 interfacebuilder 和故事板。我的 UITableViewController 是在故事板中自定义的,带有自定义单元格,给了我想要的东西。但是,我希望我的 resultsTableViewController 看起来和我的 tableViewController.
完全一样问题:有没有办法在故事板中为我的 tableViewController 和 resultsTableViewController 使用相同的场景? 如果不是,最好的解决方法是什么? 这个问题在这里得到了部分回答:How to share one storyboard scene between multiple UIViewControllers,但我还有很长的路要走。
在 Apple 开发者论坛 tartempion 的帮助下,我终于在一个文件中管理了 UTableviewController 和 searchViewController,使我能够使用相同的故事板场景来显示搜索结果。
@interface TableViewController () <UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating>
{
UISearchController *_searchcontroller;
NSArray * myArray;
NSArray * myDisplayedArray;
}
@end
@implementation TableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[...]
_searchcontroller=[[UISearchController alloc]initWithSearchResultsController:nil];
_searchcontroller.searchResultsUpdater =self;
_searchcontroller.dimsBackgroundDuringPresentation=NO;
myDisplayedArray=myArray;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [myDisplayedArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyClass*myInstance =[myDisplayedArray objectAtIndex:[indexPath row]];
//and however you want to configure cells...
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//whatever you need...
//and to get rid of the searchcontroller when you move to the UIView that is connected
self.searchcontroller.active=NO;
//or
[self.searchcontroller dismissViewControllerAnimated:NO completion:nil];
}
#pragma mark -
- (void)updateSearchResultsForSearchController:(UISearchController *)inSearchController
{
if (_searchController==inSearchController)
{
NSString *tSearchText = inSearchController.searchBar.text;
if ([tSearchText length]==0)
{
myDisplayedArray=myArray;
}
else
{
myDisplayedArray=[myArray filteredWithPattern:tSearchText];
}
[self.tableView reloadData];
}
}
@end