UITableView已填充但未显示数据或行

时间:2016-11-28 06:52:08

标签: ios uitableview swift3

我知道这个特定的问题之前曾在SO中被提出并回答,但是交叉检查了这些答案,仍然无法解决这个问题。可能是一个愚蠢的错误,但无法指出它。

交叉检查: Cell Identifierid 通过“接口”构建器

添加的数据源和委托

代码:

var sensorFields = [Sensor]()
    override func viewDidLoad() {
        super.viewDidLoad()
        readParseDataFromCSV(file: "csvFile")

    }


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

        print(self.sensorFields.count)// has count 120
        return self.sensorFields.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "SensorTableCell") as! SensorTableViewCell

        cell.lblSensorName.text = sensorFields[indexPath.row].labelName
        cell.lblSensorValue.text = sensorFields[indexPath.row].labelValue

        print(sensorFields[indexPath.row].labelName) // doesn't seem to enter to this code block
        print(sensorFields[indexPath.row].labelValue)

        return cell
    }

    func readParseDataFromCSV(file:String){
        let filepath = Bundle.main.path(forResource: file, ofType: "csv")!

        do {
            let csv = try CSV(contentsOfURL: filepath)
            let rows = csv.rows

            for row in rows{

                let sensorlblName = row["data column 1"]
                let sensorlblValue = row["data column 2"]
                let sensor = Sensor(labelName: sensorlblName!, labelValue: sensorlblValue!)

                sensorFields.append(sensor)

            }


        } catch {

            print(error.localizedDescription)

        }
    }

class SensorTableViewCell: UITableViewCell {

    @IBOutlet weak var lblSensorName: UILabel!
    @IBOutlet weak var lblSensorValue: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

是否有任何错过,使用应用程序中的其他表视图已完全与此完全不同。 使用Xcode 8.1和Swift 3.0

编辑:

添加了reloadData()

似乎是这样的 func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {}

也没有解雇。

请帮忙。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

检查这个

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    var cell = tableView.dequeueReusableCellWithIdentifier("SensorTableCell") as UITableViewCell!
    if !cell {
        cell = UITableViewCell(style:.Default, reuseIdentifier: "SensorTableCell")
    }

}

答案 1 :(得分:0)

只需将数据附加到sensorFields数组,即可对tableView中显示的单元格产生影响。

您需要在reloadData上调用tableView,以便它知道数据确实发生了变化,并使用新数据重新填充了单元格。

for row in rows {

    let sensorlblName = row["data column 1"]
    let sensorlblValue = row["data column 2"]
    let sensor = Sensor(labelName: sensorlblName!, labelValue: sensorlblValue!)

    sensorFields.append(sensor)

}

tableView.reloadData()

我也希望

// newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
// Swift 2
func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell
// Swift 3
func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell

// Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
// Swift 2
func dequeueReusableCellWithIdentifier(identifier: String) -> UITableViewCell?
// Swift 3
func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell?

因为dequeueReusableCellWithIdentifier(identifier: String)无法保证在尚未分配UITableViewCell的单元格时返回identifier。 (" [...]获取已分配的单元格,而不是分配新的单元格。"

并确保您的IBOutlets已连接! (lblSensorNamelblSensorValue