Как использовать одну сцену UIStoryboard с UITableViewController и resultsTableViewController вместе с UISearchController?

В iOS 8 UISearchDisplayController устарел, оставив UISearchController возможность добавлять поведение поиска в приложения. Это вынуждает разработчиков создавать отдельный UITableviewController для отображения результатов поиска — давайте назовем этот tableViewController для resultsTableViewController. Как перейти с UISearchDisplayController на UISearchController, хорошо описано в этой теме: searchDisplayController устарел в iOS 8

В своих приложениях я использую конструктор интерфейсов и раскадровку. Мой UITableViewController настраивается в раскадровке с настраиваемыми ячейками, что дает мне то, что я хочу. Однако я хочу, чтобы мой resultsTableViewController выглядел точно так же, как мой tableViewController.

Вопрос. Можно ли использовать одну и ту же сцену в раскадровке как для моего tableViewController, так и для resultsTableViewController? Если нет, то какой лучший обходной путь? Частично на этот вопрос дается ответ здесь: Как разделить одну сцену раскадровки между несколько UIViewController, но мне еще многое предстоит сделать.


person Tom Tallak Solbu    schedule 02.01.2015    source источник
comment
Чтобы избежать этой проблемы, не могли бы вы установить для resultsTableViewController значение nil и вместо этого применить фильтр к основному tableView?   -  person pbasdf    schedule 04.01.2015
comment
Да, действительно :-) Смотрите мой ответ.   -  person Tom Tallak Solbu    schedule 04.01.2015
comment
Отлично. Не видел filteredWithPattern: раньше - он определен в категории NSArray?   -  person pbasdf    schedule 04.01.2015
comment
Нет. Это самодельный метод с использованием стандартного NSPredicate :-)   -  person Tom Tallak Solbu    schedule 04.01.2015


Ответы (1)


С помощью tartempion на форуме разработчиков Apple мне наконец удалось управлять 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
person Tom Tallak Solbu    schedule 04.01.2015