#ios #cell #expandable
#iOS #ячейка #расширяемый
Вопрос:
Я изучил весь StackOverflow о расширяемом представлении таблицы, но они опубликовали только заголовок «Показать» с ячейками. На самом деле, iOS 15 изменила новые интерфейсы дизайна UITableView, как известно .insetGrouped
.
В основном заголовок в .insetGrouped
действительно ужасных интерфейсах дизайна для расширения. Я пытаюсь донести свою идею использовать только ячейку для расширения без необходимости раздела.
Мои коды Представления Таблицы Здесь:
class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { struct Object { var seactionName: String! var seactionObjection: [String]! var footerName: String! } var objectArray = [Object]() var TableView = UITableView() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. objectArray = [ Object(seactionName: "Header", seactionObjection: ["Expandable Cell", "One Row", "Two Row"], footerName: "Footer"), // copy and paste new cells ] title = "Help Center" view.backgroundColor = UIColor.quaternarySystemFill TableView.frame = view.bounds TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped) TableView.showsVerticalScrollIndicator = true TableView.indicatorStyle = .default TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List") TableView.delegate = self TableView.dataSource = self view.addSubview(TableView) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int { return objectArray[section].seactionObjection.count } func numberOfSections(in tableView: UITableView) -gt; Int { return objectArray.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -gt; String? { return objectArray[section].seactionName } func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -gt; String? { return objectArray[section].footerName } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell cell.backgroundColor = .secondarySystemGroupedBackground cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row] cell.textLabel?.numberOfLines = 0 return cell } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){ view.tintColor = .clear let header = view as! UITableViewHeaderFooterView header.textLabel?.textColor = UIColor.label } }
Ну, я мог бы изменить этот код
cell.accessoryType = .disclosureIndicator
к этому
let disclosureIndicatorTapped = UIImageView() disclosureIndicatorTapped.image = UIImage(systemName: "chevron.forward") // When tapped automatic to "Chevron.down" cell.accessoryView = disclosureIndicatorTapped
Есть идеи, как получить расширяемые ячейки в UITableView с помощью Swift, без необходимости в верхнем или нижнем колонтитулах?
Спасибо!
Комментарии:
1. Непонятно, к чему ты клонишь… Ты хочешь
.insetGrouped
, чтобы я так выглядела? Или нет? Вам нужен верхний и нижний колонтитулы для каждого раздела? Или вам не нужны верхние/нижние колонтитулы разделов, но вы хотите нажать на первую строку раздела, чтобы развернуть/свернуть этот раздел? Это может помочь, если вы вручную расположите свой стол так, как вы хотите, чтобы он выглядел, и опубликуете его снимок экрана.2. Я хочу, чтобы мой TableView .был сгруппирован. Я не хочу, чтобы верхний колонтитул расширялся/сворачивался. Единственная ячейка, которая может вот так расширяться/сворачиваться.
Ответ №1:
Вы можете добавить свойство Bool «расширенное» к вашему объекту.
В numberOfRowsInSection
, если значение расширено Верно, верните количество элементов в seactionObjection
, иначе верните 1
.
Затем didSelectRowAt
, если это первая строка в разделе , переключите expanded
свойство объекта этого раздела и перезагрузите раздел.
Вот измененная версия вашего класса контроллера:
class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { struct Object { var seactionName: String! var expanded: Bool! var seactionObjection: [String]! var footerName: String! } var objectArray = [Object]() var TableView = UITableView() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. objectArray = [ Object(seactionName: "Header 1", expanded: false, seactionObjection: ["Expandable Cell 1", "One Row 1", "Two Row 1"], footerName: "Footer 1"), Object(seactionName: "Header 2", expanded: false, seactionObjection: ["Expandable Cell 2", "One Row 2", "Two Row 2"], footerName: "Footer 2"), Object(seactionName: "Header 3", expanded: false, seactionObjection: ["Expandable Cell 3", "One Row 3", "Two Row 3"], footerName: "Footer 3"), // copy and paste new cells ] title = "Help Center" view.backgroundColor = UIColor.quaternarySystemFill TableView.frame = view.bounds TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped) TableView.showsVerticalScrollIndicator = true TableView.indicatorStyle = .default TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List") TableView.delegate = self TableView.dataSource = self view.addSubview(TableView) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int { // if section is expanded // return count of seactionObjection // else // return 1 return objectArray[section].expanded ? objectArray[section].seactionObjection.count : 1 } func numberOfSections(in tableView: UITableView) -gt; Int { return objectArray.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -gt; String? { return objectArray[section].seactionName } func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -gt; String? { return objectArray[section].footerName } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell cell.backgroundColor = .secondarySystemGroupedBackground cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row] cell.textLabel?.numberOfLines = 0 // if it's the first row in a section, // show accessoryView with // chevron.up or chevron.down // based on section Object expanded property if indexPath.row == 0 { let chevronName = objectArray[indexPath.section].expanded ? "chevron.up" : "chevron.down" let img = UIImage(systemName: chevronName) let disclosureView = UIImageView(image: img) cell.accessoryView = disclosureView } else { // not the first row in a section, so // clear the accessoryView cell.accessoryView = nil } return cell } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){ view.tintColor = .clear let header = view as! UITableViewHeaderFooterView header.textLabel?.textColor = UIColor.label } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if indexPath.row == 0 { objectArray[indexPath.section].expanded.toggle() tableView.reloadSections([indexPath.section], with: .automatic) } else { // do something else on row selection } } }
Комментарии:
1. Я пишу с вашего кода и понимаю, как работать! Это понятнее и проще простого! Большое вам спасибо, Но одна вещь, которую вы забыли об этом, как вы можете сделать
.disclosureIndicator
.disclosureIndicatorTapped
, чтобы отобразить, когда нажмите «ячейка», и вы увидите, как справа вот так включаетсяcell.accessoryView
. Спасибо тебе!2. @AntonioAdrianChavez — В
cellForRowAt
, решите , устанавливать или удалять изображение на.accessoryView
основе.row
, и какое изображение использовать на основе.expanded
свойства объекта раздела. Я отредактировал свой ответ одним способом, но я призываю вас сначала попробовать это самостоятельно… это может быть хорошим опытом обучения.3. Кстати: Я знал эти базовые коды UITableViewController в течение многих лет, которые я использовал UITableViewController. Я более тщательно изучал ваш простой код С 25 минут. Я начинаю это понимать. 🙂 Эй @DonMag, как вы думаете, было ли рекомендовано использовать стрелки вверх и вниз с символом SF, а не стрелку вправо, а затем стрелку вниз?
4. @AntonioAdrianChavez — это вопрос дизайна, так что это зависит от вас, как дизайнера приложений. Лично я, когда вижу правый шеврон, ожидаю, что он «куда-нибудь уйдет». Когда я вижу левый шеврон, я ожидаю, что он «вернется». Для функций типа «Развернуть/свернуть» я ожидаю шевроны вверх/вниз… или кнопку с надписью «Развернуть/свернуть»… или кнопка «Больше/меньше»… или что-то еще.
5. Хорошо, Понял. Большое вам спасибо за некоторые советы и полезные ответы! 🙂