Как сделать расширяемым только ячейки (НЕ РАЗДЕЛ/ ЗАГОЛОВОК) с помощью UITableView в Swift?

#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. Хорошо, Понял. Большое вам спасибо за некоторые советы и полезные ответы! 🙂