Swift 标题部分的TableView视图赢得';t恢复第一响应者

Swift 标题部分的TableView视图赢得';t恢复第一响应者,swift,uitableview,resignfirstresponder,becomefirstresponder,Swift,Uitableview,Resignfirstresponder,Becomefirstresponder,这里的情况很奇怪,希望有人能帮忙。基本上,我有一个这样的开关: private var searchMode = false { didSet { if !searchMode { self.tableView.endEditing(true) } tableView.reloadData() } } func tableView(_ tableView: UITableView, viewForHeade

这里的情况很奇怪,希望有人能帮忙。基本上,我有一个这样的开关:

private var searchMode = false {
    didSet {
        if !searchMode {
            self.tableView.endEditing(true)
        }
        tableView.reloadData()
    }
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if searchMode {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "searchHeader") as! SearchTableViewHeader
        header.searchField.becomeFirstResponder()
        header.searchField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
        return header
    } else {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "blueHeader") as! OpaqueBlueTableViewHeader
        header.titleLabel.text = "Discover Innovative Services"
        header.subtitleLabel.text = "Learn about our comprehensive range of services"
        return header
    }
}
当我按下按钮时,它会被切换:

@objc func searchTapped() {
    searchMode.toggle()
}
我的标题设置如下:

private var searchMode = false {
    didSet {
        if !searchMode {
            self.tableView.endEditing(true)
        }
        tableView.reloadData()
    }
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if searchMode {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "searchHeader") as! SearchTableViewHeader
        header.searchField.becomeFirstResponder()
        header.searchField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
        return header
    } else {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "blueHeader") as! OpaqueBlueTableViewHeader
        header.titleLabel.text = "Discover Innovative Services"
        header.subtitleLabel.text = "Learn about our comprehensive range of services"
        return header
    }
}
到目前为止还不错。事情是这样的。我第一次单击按钮时,searchMode变为true,并且我的UITextfield出现,并且它正确地是第一个响应者。到现在为止,一直都还不错。然后,当我再次单击它时,文本字段消失。到现在为止,一直都还不错。但是,当我再次单击它时,文本字段会正确显示,但它比响应者长得多!让我给你看看这个问题。

在gif中令人困惑,但我第一次单击它时,它是第一个响应者,然后不再是。有人知道我怎样才能恢复第一反应吗?

试试:

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


if searchMode {



} else {
    let previousHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: "searchHeader") as! SearchTableViewHeader
  previousHeader.searchField.resignFirstResponder()

   }
 }

以下是两件您可以尝试的事情:

  • 调用
    tableView.layoutifneed()
    后,调用
    reloadData()
    并使标题视图成为第一个响应者:
  • 按照建议实现tableView.reloadDataWithCompletion,并在completion块中调用makeFirstResponder:

好的,这些方法很有用,但我发现这里是唯一有效的答案:

首先,在调用reloadData()之前,文本字段消失后,退出第一响应者

然后,在最后一个tableView函数中设置first responder这是因为在viewForHeader中设置first responder时出现意外行为

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if searchMode, let stv = view as? SearchTableViewHeader {
        stv.searchField.becomeFirstResponder()
    }
}

也许这有帮助:我尝试过这种方法。让我辞去响应者好吧,但它不会恢复第一响应者..:(
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if searchMode, let stv = view as? SearchTableViewHeader {
        stv.searchField.becomeFirstResponder()
    }
}