【问题标题】:Hide SearchController again after scrolling down向下滚动后再次隐藏 SearchController
【发布时间】:2020-11-09 20:19:38
【问题描述】:

我让 SearchController 与我的 TableView 一起显示,这是启动时与向上滚动时的样子:

这是完美的,因为我希望它在不使用时隐藏起来。但是,显示后,我无法通过向下滚动再次隐藏它。如何获得该功能?

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchControllerDelegate, UISearchResultsUpdating {
    
    @IBOutlet weak var tableView: UITableView!        
    
    func updateSearchResults(for searchController: UISearchController) {
        let searchBar = searchController.searchBar
        filterContentForSearchText(searchBar.text!)
    }

    var isSearchBarEmpty: Bool {
      return searchController.searchBar.text?.isEmpty ?? true
    }

    func filterContentForSearchText(_ searchText: String) {
      filteredStrings = stockArr.filter { (string: String) -> Bool in
        return string.lowercased().contains(searchText.lowercased())
      }
      tableView.reloadData()
    }
    var filteredStrings: [String] = []

    var searchController : UISearchController!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
        

        let searchController = UISearchController(searchResultsController: nil)

        searchController.searchResultsUpdater = self

        searchController.obscuresBackgroundDuringPresentation = false

        searchController.searchBar.placeholder = "Search Candies"

        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
        
        definesPresentationContext = true
  
    }
}

编辑:

我玩过添加

tableView.tableHeaderView = searchController.searchBar
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "hello"

但它看起来不像普通的 SearchControllers(我不明白为什么我不能让它像其他人一样工作,它应该根据我在这里看到的内容自动具有此功能http://blog.eppz.eu/swiftui-search-bar-in-the-navigation-bar/)

【问题讨论】:

  • 不要忘记在此处添加相关代码。看到这篇文章的人应该能够理解上下文。

标签: ios swift xcode tableview uisearchcontroller


【解决方案1】:

您可能必须检查UITableView 的滚动方向并通过代码手动禁用UISearchController。方法如下:

var lastContentOffset: CGFloat = 0 // declare the previous offset for reference

override func viewDidLoad() {
    super.viewDidLoad()
    //...
    searchController = UISearchController(searchResultsController: nil) // remove let
    navigationItem.hidesSearchBarWhenScrolling = true
    //...
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    navigationItem.searchController = lastContentOffset < scrollView.contentOffset.y ? nil : searchController
}

【讨论】:

  • 已插入此代码,但在我再次尝试向下滚动后它会使我的项目崩溃。此功能是否未包含在默认 SearchController 中?
  • 您必须将函数范围之外的searchController 声明移至视图控制器的范围。
  • 是的,我在 viewDidLoad 函数之外有 var searchController : UISearchController!
  • 你在 viewDidLoad 中声明了一个新的 searchController。初始化现有的,您的问题就解决了。只需删除let。如果不清楚,请查看我的更新。
  • 哦,它不再崩溃了,但不幸的是滚动后仍然没有隐藏搜索。它只是像往常一样反弹。
猜你喜欢
  • 2020-11-11
  • 2022-08-03
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多