以TableView分组样式动态添加行

时间:2017-03-28 20:27:06

标签: ios uitableview swift3 grouped-table

我有TableView分组样式有3个部分,我需要动态添加行到此部分。当我添加:

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

没关系,但是当我改变号码号码时,我得到了错误:

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
    }

}

enter image description here

1 个答案:

答案 0 :(得分:0)

当我为自定义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)

        })
    }