【问题标题】:UISearchController does not display as expectedUISearchController 未按预期显示
【发布时间】:2017-11-24 09:09:20
【问题描述】:

我正在尝试将 UISearchController 添加到包含 UITableView(以及 MKMapView,但希望这不是问题)的 UIViewController。我关注了Ray Wenderlich's tutorial,但在行为方面我无法得到相同的结果。

这是我的 viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the Search Controller
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "")
        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = true
        } else {
            tableView.tableHeaderView = searchController.searchBar
        }
        definesPresentationContext = true

        self.modeSelector.layer.cornerRadius = 5.0

        if let split = splitViewController {
            let controllers = split.viewControllers
            detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController
        }

        self.navigationItem.rightBarButtonItem?.isEnabled = false
    }

注意中间的#available测试是因为我需要支持iOS到9.1。

现在我看到了几个问题:

  • 搜索栏立即出现,我无法通过滚动隐藏它
  • 当我聚焦搜索栏时,tableview 的顶部不会粘在导航项的底部:

我看到 Ray Wenderlich 的示例项目的唯一主要区别是,由于我使用 Xcode 9 创建了我的项目,我的故事板不使用顶部和底部布局指南,而是使用安全区域。不知道这是否相关,但这是我看到的唯一内容。

知道发生了什么以及如何解决这个问题吗?

【问题讨论】:

  • 点击你的视图控制器然后在AI中取消选中Adjust Scroll View Insets希望这会有所帮助。
  • @DharmeshKheni 不,它不会改变任何东西。相同的行为。
  • @matt 也没有改变任何东西。
  • self.searchController.dimsBackgroundDuringPresentation = YES 如果您使用另一个视图控制器进行 searchResultsController 很有用但是在您的代码中您使用当前视图来显示结果
  • @Sebastien 嘿,如果我的回答有助于解决问题,请将其标记为正确答案。谢谢

标签: ios swift uitableview uisearchcontroller


【解决方案1】:

如果您需要支持最高 9.1 的 iOS,您可能会使用版本低于 9.1 的模拟器。因此,“可能”obscuresBackgroundDuringPresentation 不会正确影响searchController,因为它仅适用于 iOS 9.1 或更高版本。添加dimsBackgroundDuringPresentation 最高支持9.1:

if #available(iOS 9.1, *) {
    searchController?.obscuresBackgroundDuringPresentation = false
} else {
    searchController?.dimsBackgroundDuringPresentation = false
}

如果这不能按预期显示,我几乎可以肯定问题出在您的布局约束上。如果您无法使您的布局符合安全区域,请添加您当前的约束。

【讨论】:

  • 这个“如果可用”并没有改变任何东西,但我查看了约束,我确实在 IB 中发现了一些奇怪的东西:我的 tableView 的顶部约束是这样的: - Table View.Top Equal Superview.Top - 常量:0 如果我将其更改为: - Table View.Top Equal Safe Area.Top - 常量:0 它似乎给了我预期的布局,即使在 iOS 11 上,当我激活搜索栏时,表格视图等待搜索栏动画的结尾到达其正确位置。但这已经足够了。现在我只需要弄清楚为什么默认会出现搜索栏。
  • 将约束“对齐顶部到:安全区域 - 常量 = 0”添加到您的表中肯定会在这种情况下产生奇迹。 :) 你接下来想要什么?如果您仍然无法解决这个问题,能否提供更多屏幕截图来展示您当前的进度?
  • 我最终切换回 tableHeaderView 策略,因为我想在此控制器中为相同数据在表和地图视图之间切换,并且我不想在地图中显示搜索栏模式。有了这个,并且布局顶部与安全区域对齐,我在 iPhone X 上仍然有一个小错误,但我的客户都没有,所以没关系。
【解决方案2】:

在你的viewDidload中使用下面这行代码

self.navigationController?.navigationBar.isTranslucent = false

希望对你有帮助

【讨论】:

  • 谢谢。现在在 iOS 11 中,表格视图的顶部固定在导航栏的底部。但是默认情况下仍然显示搜索栏,当我滚动时它仍然停留在那里。
  • 另外,当我这样做时,它会搞砸我在那个之后推送的所有其他视图控制器。
  • 供剩余的viewcontroller self.navigationController?.navigationBar.isTranslucent = true使用
【解决方案3】:

如果您使用的是 xcode 9 (ios 11)。那么你真正想做的是—— 使用新的更广泛的导航栏,这是 ios 11 设备中的新亮点。但是由于很多人还没有转入ios-11,所以之前版本的设备也是考虑在内的。 为了将搜索栏添加到较新的导航栏,我使用了以下功能,该功能在滚动时提供搜索栏并在用户滚动页面时将其隐藏。

func addSearchBar() {
if #available(iOS 11.0, *) {
  let sc = UISearchController(searchResultsController: nil)
  sc.delegate = self
  let scb = sc.searchBar
  scb.tintColor = UIColor.white
  scb.barTintColor = UIColor.white
  //Change the colors as you like them
  if let textfield = scb.value(forKey: "searchField") as? UITextField {
    textfield.textColor = UIColor.blue
    if let backgroundview = textfield.subviews.first {

      // Background color
      backgroundview.backgroundColor = UIColor.white

      // Rounded corner
      backgroundview.layer.cornerRadius = 10;
      backgroundview.clipsToBounds = true;
    }
  }

  if let navigationbar = self.navigationController?.navigationBar {
    navigationbar.barTintColor = UIColor.white
  }
  navigationItem.searchController = sc
  navigationItem.hidesSearchBarWhenScrolling = true
}else{
//add the logic for previous version devices here.
}

我还设置了 self.navigationController?.navigationBar.prefersLargeTitles = true; 在 vi​​ewDidLoad 中,因为 xcode9 中有一个错误,并且从界面构建器设置它不起作用(还)。

以下方法取自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多