Динамически добавлять строки в сгруппированном стиле TableView

У меня есть сгруппированный стиль TableView с 3 разделами, мне нужно динамически добавить строку в этот раздел. Когда я добавляю:

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

Это нормально, но когда я меняю номер numberOfRowsInSection, я получаю сообщение об ошибке:

2017-03-29 04:21:42.032 TableView-Grouped[81597:7624167] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000106cc5d4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000103fd821e objc_exception_throw + 48
    2   CoreFoundation                      0x0000000106d1ec2f 

Мой код:

import UIKit

class ViewController: UITableViewController {

    var arr = ["Row 1", "Row 2", "Row 3"]
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.reloadData()

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = arr[indexPath.row]
        return cell
    }

}

введите описание изображения здесь

1 ответ

Когда я добавляю строку для своего пользовательского TableView, мне нужно вручную перезагрузить данные для строк:

//swift 2.3
dispatch_async(dispatch_get_main_queue(), { () -> Void in
    self.tableView.reloadData()
})

//swift 3
DispatchQueue.main.async{
    self.tableView.reloadData()
}

Если у вас есть функция, которая добавляет данные arr необходимо перезагрузить в тот момент, как:

 func refresh() {
        //remove if need
        arr.removeAll()
        self.GetData()
        DispatchQueue.main.async(execute: {
            self.myTable.performSelector(onMainThread: #selector(UICollectionView.reloadData), with: nil, waitUntilDone: true)

        })
    }
Другие вопросы по тегам