如何将一个 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.

完全一样

问题:有没有办法在故事板中为我的 tableViewControllerresultsTableViewController 使用相同的场景? 如果不是,最好的解决方法是什么? 这个问题在这里得到了部分回答: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