Как программно зарегистрировать UITableViewHeaderFooterView в Swift 4? - PullRequest
0 голосов
/ 30 июня 2018

Мне нужен мой tableView для запуска события:

override func tableView(_ tableView: UITableView, didEndDisplayingFooterView view: UIView, forSection section: Int)

для этого, в соответствии с документацией, я не могу просто добавить представление в tableView следующим образом:

tableView.tableFooterView = spaceView

, который во время работы не вызывает срабатывания этой функции, и при этом таблица не отключает нижний колонтитул, несмотря на то, как долго может работать таблица.

Я не могу сделать это в раскадровке / XIB, потому что, добавлен ли нижний колонтитул или нет, решение принимается только во время выполнения.

Итак, в соответствии с документацией или, по крайней мере, моим пониманием, я должен сделать 'spaceView' подклассом UITableViewHeaderFooterView и сделать формальный 'регистр', чтобы добавить его в tableView, например так:

let spaceView = UITableViewHeaderFooterView(reuseIdentifier: "emptyFooter")

tableView.register(spaceView, forHeaderFooterViewReuseIdentifier: "emptyFooter")

Но тогда я получаю ошибку компиляции:

Cannot invoke 'register' with an argument list of type '(UITableViewHeaderFooterView, forHeaderFooterViewReuseIdentifier: String)'

Итак, несмотря на документы, есть идеи, как я читаю в документе, неправильно?

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Правильный ответ на ваш вопрос:

class CustomTableViewHeaderFooterView: UITableViewHeaderFooterView { }

class CustomTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomTableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "CustomTableViewHeaderFooterView")
    }
}

Тогда вы можете использовать зарегистрированный вид верхнего / нижнего колонтитула следующим образом:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 44
}

override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let customFooterView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomTableViewHeaderFooterView")
    // set up your footer view
    return customFooterView
}

Для достижения того, что вы объяснили в ваших комментариях, хотя вам не нужно регистрировать никаких UITableViewHeaderFooterView. Вместо этого вы можете использовать tableFooterView табличного представления и реализовать эту функцию самостоятельно. Попробуйте это в вашем UITableViewController классе:

override func viewDidLoad() {
    super.viewDidLoad()

    let footerView = UIView()
    footerView.backgroundColor = .orange
    footerView.frame.size.height = 44

    tableView.tableFooterView = footerView
}

var footerViewIsVisible = false {
    didSet {
        if !footerViewIsVisible && oldValue {
            tableViewDidEndDisplayingTableFooterView(tableView)
        }
    }
}

func tableViewDidEndDisplayingTableFooterView(_ tableView: UITableView) {
    print("didEndDisplayingTableFooterView")
    tableView.tableFooterView = nil
}

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if let tableFooterView = tableView.tableFooterView {
        let visibleRect = CGRect(origin: scrollView.contentOffset, size: scrollView.bounds.size)
        self.footerViewIsVisible = visibleRect.intersects(tableFooterView.frame)
    }
}
0 голосов
/ 30 июня 2018

Спасибо за предложения, но ни одно из них не решило проблему или не привело к решению.

Вместо этого у меня есть такая функциональность, как я и хотел, с небольшой функцией из 6 строк кода и одним частным свойством в контроллере представления.

Как только tableView.footerView выходит за пределы экрана, он мгновенно устанавливается равным нулю и создается только тогда, когда я этого хочу.

0 голосов
/ 30 июня 2018

вы можете сделать так:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 45
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 60))
    headerView.backgroundColor = UIColor(red: 30/255, green: 30/255, blue: 32/255, alpha: 1.0)
    return headerView
}
...