简体   繁体   中英

swift: tableview does not work after reloadData

i have a tableview in a viewcontroller and because i need to reuse most of the code for another table i created an extra class:

class StatisticsViewDelegate: NSObject, UITableViewDelegate, UITableViewDataSource {

    var defaultList:[String]
    var infolist:[String] = []    
    var tableView:UITableView
    var controller:UIViewController?

    init(defaultList:[String], view:UITableView, controller:UIViewController?) {
        self.defaultList = defaultList
        self.controller = controller
        tableView = view        
        super.init()
        tableView.delegate = self
        tableView.dataSource = self
        loadTable()
    }

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

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "infocell", for: indexPath) as! TableViewCell
        // [fill cell]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // [...]
    }



    func loadTable() {

        DispatchQueue.global(qos: .userInitiated).async {
           //[...] 
           // in this case:
           self.infolist = self.defaultList
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }


}

and in my UITViewController in the viewDidLoad() : delegate = StatisticsViewDelegate(defaultList: defaultList, view: tableView, controller:self) delegate is a member of the ViewController

now when i run it, the function func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) never gets called. The func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) gets called however(before and after the reload) and returns the correct number(in my case 4). The TableView isn't visible at all. Where is my error?

Maybe you can use the subclassing strategy to resolve your problem. There are many reference passed to your class and if you forgot to clean that up you will be have memory leaks in your hand. So I'll suggest the simple example as below. You can modify as you like and let me know if that was what you are after. If not please pardon me.

//This will be parent class that will handle all table methods, so you need to write only once the delegates and stuffs
class MyCommonTableController: UITableViewController {

var infoList = [String]()

// MARK: - TableView Delegate and Datsource Impl
override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 55.0
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = infoList[indexPath.row]
    return cell
}

}

The first class that is directly subclassing the from above MyCommonTableController

//In here we just have to know the data and set the infoList from parent
class TheTableViewController: MyCommonTableController {


let defaultList = ["Data1","Data2","Data3"] //....etc


override func viewDidLoad() {
    super.viewDidLoad()

    //this is were I will set those
    infoList = defaultList

    //reload the table
    tableView.reloadData()
}


}

The second class that is directly subclassing the from above MyCommonTableController . Same process goes here

class TheSecondTableViewController: MyCommonTableController {


let defaultList = ["List1","List2","List3"] //....etc


override func viewDidLoad() {
    super.viewDidLoad()

    //this is were I will set those
    infoList = defaultList

    //reload the table
    tableView.reloadData()
}


}

And now you are not repeating and table methods. You can also get the reference of table and use in your norma table view

@IBOutlet weak var theTable: UITableView!


let defaultList = ["List1","List2","List3"] //....etc
let commonTable = MyCommonTableController()

// MARK: - LifeCycle
override func viewDidLoad() {
    super.viewDidLoad()

    commonTable.infoList = defaultList
    commonTable.tableView = theTable
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM