操作文本字段

时间:2016-09-15 04:24:01

标签: ios objective-c uisearchbar uisearchcontroller

我遇到了一个引起严重问题的问题。

在Interface Builder中,我有一个仅包含tableview的场景。此子类的控制器UITableViewController。我有另一个场景,顶部有一个高度为50的视图,横跨视图的宽度。下面是一个最终包含列表或地图的容器视图。控制器是UIViewController的子类。这是模拟器上的样子......

enter image description here

请注意,您在上图中看到的列表是完全不同的表和视图控制器。搜索栏控制器用于按城市或邮政编码搜索位置。搜索栏控制器的表视图覆盖其他列表。当从搜索表中选择一个位置时,该位置的区域将被馈送到另一个控制器,该控制器使用私有Web服务来检索感兴趣的点列表。

我正在调用以下方法将搜索栏添加到上述视图中。

- (void)setupSearchView {
    self.searchTableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LocationSearchTable"];
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchTableViewController];
    self.searchController.searchResultsUpdater = self.searchTableViewController;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.tag = 9189;
    self.searchController.searchBar.placeholder = @"Search by city or ZIP code";
    [self.searchView addSubview:self.searchController.searchBar];
    [[self.searchView viewWithTag:9189] becomeFirstResponder];
    self.searchController.hidesNavigationBarDuringPresentation = false;
    self.searchController.dimsBackgroundDuringPresentation = true;
    self.definesPresentationContext = true;
}

当我在文本字段中单击,并将self.definesPresentationContext设置为true时,搜索栏会下拉导航栏的确切高度,在其上方留下一个大的空白区域。

definesPresentationContext = true

如果self.definesPresentationContext为false,则行为和结果不同。在这种情况下,当我点击搜索字段时,一切看起来都很好。但是一旦我开始键入,导航控制器就会被白色覆盖。搜索栏不会改变位置。如果我使用Reveal,我可以看到导航栏已被推回堆栈中。这就是看起来像......

self.definesPresentationContext = false

我错过了什么?

2 个答案:

答案 0 :(得分:0)

我有同样的问题。在屏幕上进行每次更改后,添加一个搜索栏及其框架,以使其不会下降。该代码应有助于解决问题:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    self.searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 50)
    self.view.addSubview(searchController.searchBar)
}

并在viewDidLoad中使用:

self.extendedLayoutIncludesOpaqueBars = true

答案 1 :(得分:0)

Swift 5.x解决方案:

edgesForExtendedLayout 设置为无或为空将解决此问题。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    self.edgesForExtendedLayout = []
}