Вставить раздел в UITableview - PullRequest
0 голосов
/ 06 января 2019

Как программно добавить новый раздел в UITableview?

У меня есть разбиение на страницы, и когда я пытаюсь вызвать insertSections в executeBatchUpdates, он работает нормально в первый раз, но при загрузке второй страницы UITableview не обновляется (нет ошибок, просто не обновляется и не вызывает блок завершения).

private var periods = [PeriodHistoryModel]()

func fetchHistoryWith(models: [PeriodHistoryModel]) {
    guard models.count > 0 else {
        return
    }

    let newSectionsCount = models.count - periods.count
    let lastPeriod = periods.count - 1 >= 0 ? periods.count - 1 : 0

    var newRows: [IndexPath] = [IndexPath]()
    var newSections: [IndexSet] = [IndexSet]()

    let lastPeriodOldCount = periods.last?.sessions.count ?? 0
    let lastPeriodNewCount = models[lastPeriod].sessions.count
    let newSessionsCount = lastPeriodNewCount - lastPeriodOldCount

    if lastPeriod >= 0 {>
        for index in 0..<newSessionsCount {
            newRows.append(IndexPath(row: lastPeriodOldCount + index, section: lastPeriod))
        }
    }
    for index in 0..<newSectionsCount {
        let newSectionIndex = periods.count + index
        newSections.append(IndexSet(integer: newSectionIndex))
        for rowIndex in 0..<models[newSectionIndex].sessions.count {
            newRows.append(IndexPath(row: rowIndex, section: newSectionIndex))
        }
    }

    periods = models

    tableView.performBatchUpdates({
        for index in 0..<newSections.count {
            tableView.insertSections(newSections[index], with: .none)
        }
        tableView.insertRows(at: newRows, with: .none)
    })
}

reloadData не подходит, нужно делать это гладко

1 Ответ

0 голосов
/ 06 января 2019

Правило thump: "обновить модели табличного представления перед выполнением пакетных обновлений". Я только что создал простой проект, и он отлично работает. Поэтому убедитесь, что ваш метод делегата numberOfSections возвращает счет обновленной модели.

Мой проект ниже.

class MyViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var numberOfSections: Int = 1
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func insertSectionTapped(_ sender: Any) {
        numberOfSections += 1
        let indexSet = IndexSet(integer: numberOfSections - 1)
        tableView.performBatchUpdates({
            tableView.insertSections(indexSet, with: .none)
        }) { (update) in
            print("Update SUccess")
        }
    }

    @IBAction func insertRowTapped(_ sender: Any) {
    }
}

extension MyViewController: UITableViewDelegate, UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return numberOfSections
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell.init(style: .default, reuseIdentifier: "DefaultId")
        cell.textLabel?.text = "This is Section \(indexPath.section) - Row \(indexPath.row)"
        return cell
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...