Как получить нижний колонтитул tableview (то, что уже возможно для collectionview)

#swift #uitableview

#swift #uitableview

Вопрос:

Когда я хочу получить доступ к верхнему или нижнему колонтитулу collectionview, я просто получаю его экземпляр:

 guard let footer = collectionView.supplementaryView(forElementKind: UICollectionView.elementKindSectionFooter, at: IndexPath(item: 0, section: footerIndexPath!.section)) as? CollectionFooter else { return }
  

Теперь я могу получить доступ к представлениям внутри нижнего колонтитула и изменить их значения. Как мне сделать это для tableview?

Я попробовал следующее для первого раздела:

 guard let footer = tableView.footerView(forSection: 0) as? TableFooter else { return }
  

и это не работает, т.Е. Оно не выходит за рамки инструкции guard, т.Е. Я не могу получить экземпляр нижнего колонтитула. У меня есть только 1 раздел, поэтому 1 нижний колонтитул.

Ниже показано, как я объявил нижний колонтитул.

 override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    guard let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: footerIdentifier) as? TableFooter else { return nil }
    footer.delegate = self
    return footer
}
  

И мой подкласс нижнего колонтитула:

 class TableFooter: UITableViewHeaderFooterView {
    // initializing delegate amp; other variables
      override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)


    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
  

Комментарии:

1. Объясните фразу «это не работает». Что именно происходит?

2. Извините, должно быть ясно, это не выходит за рамки инструкции guard, т.Е. Я не могу получить экземпляр нижнего колонтитула. У меня есть только 1 раздел, поэтому 1 нижний колонтитул.

3. Ну, очевидно, что нижний колонтитул не отображается, поэтому он не существует, иначе это не нижний колонтитул. Но поскольку вы не показали ни одного кода, который настраивал представление таблицы, и вы ничего не сказали о состоянии приложения при выполнении этого вызова, помочь вам невозможно. В общем, вы не должны делать то, что вы сказали: «получить доступ к представлениям и изменить их значения». Так что, возможно, это вопрос x-y, и ваш подход всегда был неправильным, даже для представлений коллекции.

4. tableView.footerView(forSection: 0) возвращает необязательный UITableViewHeaderFooterView . Вы пытаетесь привести его в TableFooter , и я предполагаю, что ваши TableFooter подклассы UITableViewCell вместо UITableViewHeaderFooterView . Вот почему ваш guard не проходит.

5. @Starsky Я добавил свой подкласс headerfooter, а также указал, как я объявил его в методе viewForFooterInSection .

Ответ №1:

Теперь я могу получить доступ к представлениям внутри нижнего колонтитула и изменить их значения

Нет, вы не можете. Тот факт, что это когда-либо работало в вашем представлении коллекции, был просто отвлекающим маневром. То, что вы делали в своем представлении коллекции, всегда было неправильным.

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

Комментарии:

1. Нижний колонтитул не является частью модели данных. Я просто добавляю метку ошибки, которую хочу обновить. Почему это должно быть отвлекающим маневром в случае collectionview? Я получил решение от SO, поэтому другие люди также используют его, хотя и без проблем.

2. Мне все равно, где вы это получили. Нижний колонтитул должен быть частью модели данных. Все в представлении таблицы / коллекции должно быть частью модели данных. Вам может не понравиться мой ответ, но я уверяю вас, что он решит вашу проблему, и я поддерживаю его.