Можем ли мы реализовать разделы внутри раздела UITableView в Swift? - PullRequest
1 голос
/ 31 октября 2019

Предположим, что есть UITableView с 2 секциями A и B. Теперь в обоих разделах несколько объектов должны быть показаны с подробностями, например, если это автомобиль, то есть несколько автомобилей, с названием, цветом, пробегом. которые должны быть показаны в объекте. Итак, как подойти к проблеме оптимальным образом, учитывая, что мы должны реализовать ее с UITableView?

Я предоставил 2 раздела для UITableView. Затем я показываю объекты в виде строк внутри разделов. Тогда, если мне нужно будет показать только 3 детали объекта, я предоставлю количество строк 3 * (Нет объектов). Следующий код написан внутри класса UITableViewCell и вызывается из UIViewController, содержащего метод источника данных объекта UITableView cellForRowAt ()

func configureSectionACellWith(indexPath: IndexPath, data: [Car]) {
   var row = indexPath.row
   row = row % 3
   switch row {
   case 0: carNameLabel.text = data[indexPath.row/3].name
   case 1: colorLabel.text = data[indexPath.row/3].color
   case 2: mileageLabel.text = data[indexPath.row/3].mileage
   default:
       break
   }
}

Аналогично, для настройки ячеек раздела B приведенный выше код былповторяется.

Но, как вы можете видеть, многие вещи жестко запрограммированы, например row = row% 3, и новому разработчику будет сложно понять код. Также есть повторение кода (Настройка ячеек раздела A и B). Есть ли другой способ, который, конечно, оптимален для решения ситуации?

1 Ответ

0 голосов
/ 31 октября 2019

Если расположение / детали, вероятно, будут одинаковыми для каждого раздела, вы можете просто создать один тип ячейки и использовать его в обоих разделах:

class DetailCell: UITableViewCell {
  static let cellID = "DetailCell"
 //set up all the images/labels etc

  func configure(with car: Car) {
    label1.text = car.name
    label2.text = car.color
    label3.text = car.mileage
  }
  func configure(with other: SomeOtherType) {. //whatever Section B displays
    label1.text = other.property1
    label2.text = other.property2
    label3.text = other.property3
  }
}

Вам не нужно беспокоиться оПуть индекса или строки для определения ячейки. Это делается в функциях dataSource и делегата.

Вы установите количество строк в каждом разделе методом UITableViewDataSource numberOfRows и создадите все свои ячейки в методе cellForRowAt. Я не буду повторять здесь все подробности - на tableViews есть сотни учебных пособий и блогов, - но приведу краткие примеры, чтобы вы знали, к чему вы стремитесь:

override func viewDidLoad() {
   super.viewDidLoad()
   tableView.register(DetailCell.self, forCellReuseIdentifier: DetailCell.cellID)
   //any other setup
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   switch section :
   case 0: return carsArray.count //if you're showing cars in section A
   case 1: return someOtherArray.count //whatever you;re showing in section B
   default: return 0
   }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: DetailCell.cellID, for: indexPath)
  if indexPath.section == 0 {
    cell.configure(with: carsArray[indexPath.row])
  } else if section == 1 {
    cell.configure(with: someOtherArray[indexPath.row])
  }
  //do any further cell set up
  return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...