Как создать список внутри списка, используя UITableView - PullRequest
0 голосов
/ 10 мая 2018

У меня есть требование. Где я должен получить список студентов, а затем я должен показать их предметы, по которым они зачислены.

Пример

Теперь вы можете видеть ниже, у меня есть список учеников, т.е. ученик1, ученик2 и так далее. и у каждого студента разное количество предметов enter image description here

Что я сделал до сих пор:

Я создал пользовательскую ячейку, содержащую метку и пустое вертикальное представление стека.

Затем в методе tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) Я запускаю цикл for, который динамически делает некоторые UiLabel и добавляет их в вертикальное представление стека

Проблема: Делая это, я получаю то, что хочу. Но когда я прокручиваю вверх и вниз, цикл for повторяет данные в ячейке снова и снова при каждой прокрутке вверх / вниз

Пожалуйста, помогите, если есть другой способ сделать это.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Вы можете использовать просмотр таблицы с разделом.

  1. Установить имя студента в разделе
  2. Установите ваши предметы в клетку

Это образец таблицы с разделом. https://blog.apoorvmote.com/uitableview-with-multiple-sections-ios-swift/

Вот пример кода, это просто для справки.

class TableViewController: UITableViewController {

let section = ["pizza", "deep dish pizza", "calzone"]

let items = [["Margarita", "BBQ Chicken", "Pepperoni"], ["sausage", "meat lovers", "veggie lovers"], ["sausage", "chicken pesto", "prawns", "mushrooms"]]
// MARK: - Table view data source

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

return self.section\[section\]

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
 // #warning Incomplete implementation, return the number of sections

return self.section.count

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 // #warning Incomplete implementation, return the number of rows

return self.items\[section\].count

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
 let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath)

// Configure the cell...

cell.textLabel?.text = self.items[indexPath.section][indexPath.row]

return cell

}

Обновление

Индивидуальный вид сечения Создайте свой собственный вид и покажите его как раздел

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

    let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
    let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a test";
    view.addSubview(label);
    view.backgroundColor = UIColor.gray;
    return view

}

Пример кода для раздела Customized

Обновление 2

Пользовательский заголовок со ссылкой на ячейку

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  headerCell = tableView.dequeueReusableCellWithIdentifier("HeaderCell") as! CustomHeaderCell
    headerCell.backgroundColor = UIColor.cyanColor()

    switch (section) {
    case 0:
      headerCell.headerLabel.text = "Student Name 1";
      //return sectionHeaderView
    case 1:
      headerCell.headerLabel.text = "Student Name 2";
      //return sectionHeaderView
    case 2:
      headerCell.headerLabel.text = "Student Name 3";
      //return sectionHeaderView
    default:
      headerCell.headerLabel.text = "Other";
    }

    return headerCell
  }
0 голосов
/ 10 мая 2018

Сначала добавьте это расширение в ваш исходный код.

extension UIStackView{
    func removeAllArrangedSubviews() {
        let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in
            removeArrangedSubview(subview)
            return allSubviews + [subview]
        }
        removedSubviews.forEach({ $0.removeFromSuperview() })
    }
}

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

override func prepareForReuse() {
    super.prepareForReuse()
    self.stackView.removeAllArrangedSubviews()
}
0 голосов
/ 10 мая 2018

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

class Student: NSObject {
    var subjectsArray : [String] = []
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...