用户切换 segmentController 索引时如何清理 searchText?

How to clean searchText when user switches segmentController index?

我在 tableView 中有一个 searchBar。它工作正常,直到我添加了一个 segmentController。当我更改段索引时,searchText 不会删除,这显然是一种糟糕的体验。

我试图添加一个 "text" 属性,它等于 searchText,并在用户切换段索引时执行 text = ""。但它没有用。我想我使用了一些错误的逻辑。

extension MyClass: UISearchBarDelegate {

     func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        var text = searchText
        if segmentController.selectedSegmentIndex == 0 {
        guard !text.isEmpty else { searchResult = data
            tableView.reloadData()
            return
        }
        searchResult = data.filter({ results -> Bool in
            results.name.contains(text)
        })
        tableView.reloadData()
        } else {
            guard !text.isEmpty else { anotherSearchResult = anotherData
                tableView.reloadData()
                return
            }
            anotherSearchResult = anotherData.filter({ results -> Bool in
                results.name.contains(text)
            })
            tableView.reloadData()
        }
    }
}

您需要观察 segmentedControl valueChanged 方法

下面的例子

class ViewController: UIViewController {

    @IBOutlet weak private var segmentedControl: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Observe value change
        segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged), for: .valueChanged)
    }

    @objc private func segmentedControlValueChanged(_ sender: UISegmentedControl) {
        // TODO: Clear searchbar
    }

}

您需要在 segmentedController 上添加一个调用 addTarget 来注册一个函数,以便在选定的段发生变化时调用。

class MyClass: UIViewController {
    ...


    @objc func clearSearchBar() {
        searchBar.text = nil
    }

    override func viewDidLoad() {
        segmentedControler.addTarget(self, action: #selector(clearSearchBar), for: .valueChanged)
    }
}