Динамически добавлять строки в сгруппированном стиле 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)
})
}