Почему переопределение tableView (: viewForHeaderInSection :) меняет результаты - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть простая реализация табличного представления без заголовка. Это результат, к которому я иду.

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.pushViewController(MyTable(style: .grouped), animated: false)
    }
}

class MyTable: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return CGFloat.leastNormalMagnitude
    }

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

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
}

table view with no header

Обратите внимание, что у меня есть переопределение для viewForHeaderInSection, которое никогда не вызывается, что ожидается, так как высота, которую я даю, по существу равна нулю.

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

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

table view with header

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Если делегат UITableView реализует tableView(_:viewForHeaderInSection:), вызывающий UITableView переключается с предположения, что вы хотите заголовков в заголовках вашего раздела, на мысль, что вы хотите просмотров в заголовках вашего раздела. После того, как это переключение выполнено, оно проверяет делегат tableView(_:heightForHeaderInSection:) - и, поскольку вы возвращаете (эффективно) ноль, я предполагаю, что табличное представление может планироваться без запроса делегата на фактическое представление.

Имейте в виду, что создание этого переключателя никогда не должно включать вызов метода view-for-header. UITableView может проверить, реализует ли его делегат селектор ObjC для метода без необходимости его фактического вызова, и соответствующим образом изменить его поведение. Скорее всего, ваше утверждение никогда не сработает.

0 голосов
/ 07 ноября 2018

Компилятор фактически выдает ошибку, если у вас нет ключевого слова override вместе с функцией.

Для переопределения требуется ключевое слово override

Error when not using override

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...