TableView viewForHeaderInSection не возобновит работу первого респондента - PullRequest
0 голосов
/ 18 января 2020

Странная ситуация здесь, в надежде, что кто-то может помочь. По сути, у меня есть такой переключатель:

private var searchMode = false {
    didSet {
        if !searchMode {
            self.tableView.endEditing(true)
        }
        tableView.reloadData()
    }
}

Он переключается при нажатии кнопки:

@objc func searchTapped() {
    searchMode.toggle()
}

Мой заголовок установлен так:

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 становится истинным, и появляется мое поле UIText, и это правильно первый респондент. Все идет нормально. Затем, когда я нажимаю на него снова, текстовое поле исчезает. Все идет нормально. НО, когда я нажимаю на него снова, textField корректно появляется, но это так дольше респондент! Позвольте мне показать вам проблему. enter image description here

Запутывает в GIF, но при первом нажатии на него, это первый респондент, а не снова. Кто-нибудь знает, как я могу заставить его возобновить работу первого респондента?

Ответы [ 3 ]

1 голос
/ 21 января 2020

Хорошо, эти подходы полезны, но я обнаружил, что это единственный ответ, который работает:

Во-первых, подайте в отставку первого респондента после исчезновения textField до вызова reloadData ()

 private var searchMode = false {
        didSet {
            if let tv = self.tableView.headerView(forSection: 0), let stv = tv as? SearchTableViewHeader {
                stv.searchField.resignFirstResponder()
            }
            tableView.reloadData()
        }
    }

Затем установите первый респондент на самую последнюю функцию tableView. Это происходит из-за непредвиденного поведения при установке первого респондента в viewForHeader

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if searchMode, let stv = view as? SearchTableViewHeader {
        stv.searchField.becomeFirstResponder()
    }
}
0 голосов
/ 21 января 2020

Вот две вещи, которые вы можете попробовать:

  • Позвонить tableView.layoutIfNeeded() после вызова reloadData() и сделать заголовок первым респондентом после этого:
if !searchMode {
    self.tableView.endEditing(true)
}
tableView.reloadData()
tableView.layoutIfNeeded()
if let headerView = tableView.headerView(forSection: 0) as? SearchTableViewHeader {
    header.searchField.becomeFirstResponder()
}
  • Реализация tableView.reloadDataWithCompletion как предложено здесь и вызов makeFirstResponder в блоке завершения:
if !searchMode {
    self.tableView.endEditing(true)
}
tableView.reloadData() {
    if let headerView = tableView.headerView(forSection: 0) as? SearchTableViewHeader {
        header.searchField.becomeFirstResponder()
    } 
}
0 голосов
/ 21 января 2020

Попробуйте:

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


if searchMode {



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

   }
 }
...