如何通过导航栏按钮轻触显示和隐藏tableView部分中的标题?

时间:2018-04-07 15:30:55

标签: ios swift uitableview

使用Xcode ver 9.3,Swift开发iOS应用程序。

你能告诉我如何通过点击导航栏按钮来显示和隐藏(切换)tableView部分中的标题吗?

  • 搜索栏放在标题部分中,以便在滚动tableview时始终可见
  • 我想在初始显示中隐藏搜索栏
  • 并通过点击导航栏按钮
  • 显示和隐藏搜索栏

代码和截图如下。

代码

import UIKit

class TableViewController: UITableViewController, UISearchBarDelegate {

    let array = ["apple", "orange", "melon", "banana", "peach"]
    let searchBar = UISearchBar()

    override func viewDidLoad() {
        super.viewDidLoad()

        let searchButton = UIBarButtonItem(title: "Search", style: UIBarButtonItemStyle.plain, target: self, action: #selector(searchTapped))
        self.navigationItem.leftBarButtonItem = searchButton
    }

    @objc func searchTapped() {
        // If searchBar is hidden, then show a searchBar.

        // If searchBar is shown, then hide a searchBar.

    }

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        searchBar.delegate = self
        searchBar.placeholder = "Search..."
        searchBar.showsCancelButton = true
        return searchBar
    }

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        searchBar.sizeToFit()
        return searchBar.frame.height
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = array[indexPath.row]
        return cell
    }

}

截图

enter image description here

3 个答案:

答案 0 :(得分:2)

var hideSearchBar = false     // Class global var

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
     return hideSearchBar ? 0.1 : searchBarHeight
}  

@IBAction func search(sender: UIBarButtonItem) {
     hideSearchBar = !hideSearchBar
     tableView.reloadData()
} 

如果要隐藏searchBar,请记住将节标题的高度保持为 0.1 。保持身高 0 将无效。

答案 1 :(得分:1)

您可以使用tableView:heightForHeaderInSection:方法中的UITableViewDelegate Appledoc。如下

override viewDidLoad() {
     super.viewDidLoad()
     yourBarButtonTapped = false

     //rest of your code
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
     return yourBarButtonTapped ? 0.1 : current_height
}

@IBAction func barButtonTapped() {
     yourBarButtonTapped = true
     yourTableView.reloadData()
}

答案 2 :(得分:1)

你可以这样做:

@objc func searchTapped() {
    // If searchBar is hidden, then show a searchBar.
    tableView.tableHeaderView = self.searchBar;
    // If searchBar is shown, then hide a searchBar.
    tableView.tableHeaderView = nil;
    tableView.reloadData();
}

或者您可以定义:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

// if you don't need header then return nil or return uiview for header...

}