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()
}
}