当UISearchController处于活动状态时,iOS 9 searchBar将从表头视图中消失

时间:2015-09-21 04:13:01

标签: ios swift uisearchbar ios9 uisearchcontroller

结构:

View1(点击按钮) - >模态地呈现(MyModalView:UITableViewController)

MyModalView嵌入了UISearchController。 UISearchController的searchBar放在MyModalView.tableView.tableHeaderView中。

自iOS 8.0以来,它一直运行良好。但是在iOS 9上,当UISearchController处于活动状态时,searchBar会消失。请看下面的图片

模态视图:modal view

UISearchController在iOS 8上有效:search bar in iOS 8

UISearchController在iOS 9上有效:search bar in iOS 9

非常标准的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}

此问题也发生在iOS 9.1 beta ...

任何想法/指针都会深表赞赏

干杯。

13 个答案:

答案 0 :(得分:68)

我不确定究竟是什么问题,但我已经修复了'它由:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

我的猜测是UISearchController在尝试呈现为导航栏时正在做一些时髦的事情。所以,这是一个黑客,但它至少不会阻止用户。搜索栏不会执行很酷的动画并掩盖导航栏。

答案 1 :(得分:66)

似乎我们所有人都遇到了同样的问题,但他们以不同的方式解决了。然而,没有一个建议的答案对我有用:(。尽管如此,谢谢大家的时间。

我找到了解决问题的解决方案。它使用Interface Builder在Storyboard中将我的(MyModalView:UITableViewController)的Opaque Bars下的Extend Edges设置为true。

总结:

MyModalView:UITableViewController,在Storyboard中使用Interface Builder

延伸边缘: - 在顶部栏下勾选 - 在底栏下方勾选 - 在不透明栏下打勾

screenshot

答案 2 :(得分:36)

我发现故事板中的模拟指标(顶部栏)导致了这个问题。 就我而言,以下几行有效,但我仍然不知道为什么。

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}

答案 3 :(得分:19)

我不得不

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

我发现了一个类似的问题here,但就我而言,它不在viewDidLoad方法上。我必须尝试不同的观点,直到它奏效。现在我可以同时拥有自定义导航栏颜色和搜索栏

答案 4 :(得分:10)

感谢@wiles duan和@Techprimate

就我而言,我通过设置:

解决了这个问题
<label>Recinto</label>
   <select class="form-control" data-toggle="modal" data-target="#cria-recinto">
      <option data-toggle="modal" data-target="#cria-recinto">O meu coliseu</option>
      <option>volvo</option>
      <option>A minha arena</option>
      <option>a garagem da minha vizinha</option>
      <option>Na esquina</option>
   </select>


<script type="text/javascript">
   $('select').change(function () {
   if ($(this).val() == "volvo") {
   $('#cria-recinto').modal('show');

}
});
</script>

在UISearchControllerDelegate

中实现以下两种方法
self.definesPresentationContext = NO;

答案 5 :(得分:6)

我通过删除

来修复它

definesPresentationContext = true

我还没有测试是否有任何删除它的缺点!

答案 6 :(得分:2)

我在应用的这个地方没有导航栏。其他SO帖子都没有帮助我,所以我已经用这种方式解决了这个问题:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}

答案 7 :(得分:2)

我遇到了同样的问题,当我在Xcode上调试UI时,发现UISearchController视图已移至另一个视图,宽度为零。

我通过将false的{​​{1}}属性设置为true,并为包含UITableViewController设置viewDidLoad()来修复此问题。

我只在override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.definesPresentationContext = false // Disable the presentation controller controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // This one remains the same // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) } 添加了一行。

public function rules()
    {
        return [
            'name' => 'sometimes|required',
            'email' => 'sometimes|required|email',
            'age' => 'sometimes|required|integer|min:15',
        ];
    }

答案 8 :(得分:1)

在storyboard中将navigationBar永久设置为半透明解决了我的问题。

答案 9 :(得分:1)

它有效

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}

答案 10 :(得分:0)

如果您想要隐藏导航栏并全屏显示搜索控制器,请在导航栏上设置以下内容,搜索栏不会失败:

navigationController?.navigationBar.translucent = true

答案 11 :(得分:0)

sc.hidesNavigationBarDuringPresentation = false

为我做了诀窍

lazy var searchController:UISearchController = {
        let sc = UISearchController(searchResultsController: nil)
        sc.searchResultsUpdater = self
        sc.obscuresBackgroundDuringPresentation = false
        sc.searchBar.placeholder = "Search"
        sc.hidesNavigationBarDuringPresentation = false
        return sc
    }()

答案 12 :(得分:0)

他们都没有为我工作,我使用此技巧对其进行了修复

func position(for bar: UIBarPositioning) -> UIBarPosition {
    if UIDevice.current.userInterfaceIdiom == .pad {
        return .top
    } else {
        if iOSVersion <= 9 {
            return .top
        }
        return .topAttached
    }


}