无法将视图推送到 searchResultsController

Posted

技术标签:

【中文标题】无法将视图推送到 searchResultsController【英文标题】:Can't push a view onto searchResultsController 【发布时间】:2016-01-07 16:27:46 【问题描述】:

我有一个 TableViewController、一个 SearchResultsController 和一个 WebViewController。当我单击 TableViewController 中的一个单元格时,它会推动 WebViewController 打开一个与该单元格相关的 url。

TableViewController 有一个 UISearchController,它将结果过滤到 SearchResultsController 但是当在 SearchResultsController 中单击一个单元格时,WebViewController 不会被推送。

这里是 SearchResultsController 的 didSelectRowAtIndexPath 的代码:

- (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。这让我觉得问题出在导航控制器上。

在网上看似乎 UISearchController 应该包装在 UISearchContainerViewController 中,然后应该放在 navigationController 中。我还是应用程序开发的新手,不知道如何或在哪里做。

我在 TableViewController 的 viewDidLoad 中调用 SearchResultsController,如下所示:

- (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 的地方吗?

【问题讨论】:

您在与 SearchResultsController 相关的第一个代码块中使用了 self.navigationController。确保 navigationController 是你想要的,它应该可以工作。 嗨,亚历克斯,感谢您的回复。您能否详细说明一下您对 self.navigationController 的含义? searchResultsController 的 navigationController 与 TableViewController 的 navigationController 不同。听起来你想使用 TableViewController 的 self.navigationController 我想我明白你的意思,但我仍然不确定我需要做什么来解决它。是否可以使用 TableViewController 的 navigationController 还是 SearchResultsController 需要嵌入到自己的 navigationController 中? 是的,你可以使用 TableViewController 的 navigationController; self.searchResultsController.parentViewController.navigationController(确保 parentViewController 是 TableViewController) 【参考方案1】:

在进行搜索时,您将展示 NewModalViewController,因此您需要做的只是在展示搜索控制器时推送 viewcontroller 的一些步骤

1)self.definesPresentationContext = YES;

在这之后你应该像这样推动你的视图控制器

2) [self.presentingViewController.navigationController pushViewController:sec Animation:YES];

注意:目前的 modalviewcontroller 没有导航控制器,因此正常的推送编码不会工作,因为它没有分配给导航。

享受.....

【讨论】:

【参考方案2】:

您可以在 SearchResultsController 中创建一个属性:

@property (nonatomic, strong) UINavigationController *navController;

然后在 TableViewController 中的 updateSearchResultsForSearchController 中设置 navController = self.navigationController。

然后您可以在 SearchResultsController 的 didSelectRowForIndexPath 中执行此操作:

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

在未能让 Arun 的上述解决方案发挥作用后,这种方法对我有用。

【讨论】:

以上是关于无法将视图推送到 searchResultsController的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 内容推送到左侧

无法使用 airplay (Apple TV) 将自定义视图推送到外部显示器

表视图推送到新视图 XIB 的

如何将视图控制器推送到 UISplitViewController

我可以将视图控制器推送到后端的 UINavigationController

将 TabBarController 推送到视图