Не удается передать представление в searchResultsController

У меня есть TableViewController, SearchResultsController и WebViewController. Когда я нажимаю на ячейку в TableViewController, он толкает WebViewController, открывая URL-адрес, связанный с ячейкой.

TableViewController имеет UISearchController, который фильтрует результаты в SearchResultsController, однако при щелчке по ячейке в SearchResultsController WebViewController не перемещается.

Вот код didSelectRowAtIndexPath для SearchResultsController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    WebViewController *webViewController = [[WebViewController alloc] init];

    NSString *extensionURL = (self.searchResults[indexPath.row])[@"url"];
    NSURL *baseURL = [NSURL URLWithString:@"http://www.baseurl.com"];
    NSURL *URL = [NSURL URLWithString:extensionURL relativeToURL:baseURL];

    webViewController.title = (self.searchResults[indexPath.row])[@"title"];
    NSLog(@"%@", URL);
    webViewController.URL = URL;
    [self.navigationController pushViewController:webViewController
                                         animated:YES];

}

Я включил NSLog, чтобы узнать, произошло ли что-нибудь при нажатии на ячейку, и он отображает URL-адрес в консоли. Это заставляет меня думать, что проблема связана с navigationController.

Глядя в Интернете, кажется, что UISearchController должен быть обернут в UISearchContainerViewController, который затем должен быть помещен в navigationController. Я все еще новичок в разработке приложений и не могу понять, как и где это сделать.

Я вызываю свой SearchResultsController в viewDidLoad моего TableViewController следующим образом:

- (void)viewDidLoad
{
    [super viewDidLoad];

    SearchResultsViewController *controller = [[SearchResultsViewController alloc] initWithStyle:UITableViewStylePlain];
    [self addObserver:controller forKeyPath:@"results" options:NSKeyValueObservingOptionNew context:nil];

    self.searchController = [[UISearchController alloc] initWithSearchResultsController: controller];
    self.searchController.searchResultsUpdater = self;
    self.searchController.hidesNavigationBarDuringPresentation = NO;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.delegate = self;
    self.definesPresentationContext = YES; 

    UISearchBar *searchBar = [[UISearchBar alloc] init];
    searchBar = self.searchController.searchBar;
    searchBar.searchBarStyle = UISearchBarStyleMinimal;
    UITextField *searchField = [searchBar valueForKey:@"_searchField"];
    searchBar.barTintColor = [UIColor whiteColor];
    searchBar.tintColor = [UIColor whiteColor];

    self.navigationItem.titleView = searchBar;

}

Здесь я должен встраивать свой SearchResultsController?


person ghertyish    schedule 07.01.2016    source источник
comment
Вы используете self.navigationController в первом блоке кода, связанном с SearchResultsController. Убедитесь, что вам нужен именно navigationController, и он должен работать.   -  person Alex    schedule 07.01.2016
comment
Привет Алекс, спасибо за ответ. Не могли бы вы немного уточнить, что вы имеете в виду в отношении self.navigationController?   -  person ghertyish    schedule 07.01.2016
comment
NavigationController searchResultsController отличается от navigationController TableViewController. Похоже, вы хотите использовать self.navigationController TableViewController   -  person Alex    schedule 07.01.2016
comment
Я думаю, что понимаю вашу точку зрения, но я все еще не уверен, что мне нужно сделать, чтобы это исправить. Можно ли использовать навигационный контроллер TableViewController или необходимо, чтобы SearchResultsController был встроен в собственный навигационный контроллер?   -  person ghertyish    schedule 07.01.2016
comment
Да, вы можете использовать навигационный контроллер TableViewController; self.searchResultsController.parentViewController.navigationController (убедитесь, что parentViewController является TableViewController)   -  person Alex    schedule 07.01.2016
comment
Что, если TableViewController не является parentViewController? Я поставил NSLog(@"%@", self.parentViewController);, чтобы узнать, что это такое, и он говорит, что родителем является UISearchController.   -  person ghertyish    schedule 07.01.2016
comment
Затем вам нужно найти способ получить навигационный контроллер TableViewController другим способом; поскольку ваш пост не совсем точно отражает ваш код, я больше не могу вам помочь.   -  person Alex    schedule 07.01.2016


Ответы (2)


При выполнении поиска вы представите NewModalViewController, поэтому все, что вам нужно сделать, это несколько шагов для нажатия контроллера представления при представлении контроллера поиска.

1)self.definesPresentationContext = ДА;

После этого вы должны нажать свой контроллер просмотра, например

2) [self.presentingViewController.navigationController pushViewController:сек анимированный:ДА];

Примечание: текущий контроллер modalviewcontroller не имеет контроллера навигации, поэтому обычное кодирование push не будет работать, поскольку оно не выделено для навигации.

Наслаждаться.....

person Arun    schedule 05.04.2016

Вы можете создать свойство в SearchResultsController:

@property (nonatomic, strong) UINavigationController *navController;

Затем в вашем updateSearchResultsForSearchController в вашем TableViewController установите navController = self.navigationController.

Затем вы можете сделать это в didSelectRowForIndexPath вашего SearchResultsController:

[self.navController pushViewController:webViewController
                                     animated:YES];

Этот подход сработал для меня после того, как не удалось заставить работать вышеупомянутое решение Аруна.

person saswanb    schedule 05.04.2017