表视图ReloadData函数不触发cellForRowAtIndexPath Swift

时间:2015-06-12 17:19:12

标签: ios swift uitableview uisearchbar

我在这里看到过类似的问题,但没有一个对我有用。

我正在我的表视图中实现一个搜索栏,看起来一切都很顺利,并且没有任何错误。我已经查看了几次代码并且找不到任何错误。所以我开始调试。

这是我的搜索功能:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

    var filtered:[Room] = filterz(rooms, txt: searchText)

    //println(filtered.count)

    if(filtered.count == 0){
        searchActive = false
    } else {
        searchActive = true
    }

    self.tView.reloadData()
}

我可以看到这是完美的,因为它打印出正确的计数。 但是我不确定reloadData函数。 我想它会触发cellForRowAtIndexPath函数,它在这里:

func  tableView(tableView:UITableView,cellForRowAtIndexPathindexPath:NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("RoomCell", forIndexPath: indexPath) as! UITableViewCell

    var room:Room = rooms[indexPath.row]

    if(searchActive){
        room = filtered[indexPath.row]
    }

    if let nameLabel = cell.viewWithTag(200) as? UILabel{

        nameLabel.text = room.name
        println(room.name)

    }

    if let sizeLabel = cell.viewWithTag(201) as? UILabel{

        sizeLabel.text = room.size
        println(room.size)

    }

    if let vacLabel = cell.viewWithTag(202) as? UILabel{

        vacLabel.text = room.vacant
        println(room.vacant)

    }

    if let taskIm = cell.viewWithTag(203) as? UIImageView{

        taskIm.image = UIImage(named: room.imagename)
    }

    return cell
} 

正如您所看到的,我已将print语句用于调试,并且它没有打印任何内容。这是因为函数没有被触发,还是因为我的代码有问题?

如果是这样,任何人都可以找到它吗?我所知道的是,直到reloadData()函数调用一切正常。

2 个答案:

答案 0 :(得分:1)

您重新声明var filtered只是更新filtered

中使用的现有cellForRowAtIndexPathindexPath

答案 1 :(得分:0)

reloadData未调用cellForRowAtIndexpath的最常见原因是您没有正确连接数据源,或者您没有引用正确的tableView。

确保viewDidLoad中的某个地方有一行如下所示:

self.tView.dataSource = self

对于遇到类似问题的人,请参阅this question

此外,您可以通过继承UITableViewCell并从标签创建插座到单元类来更轻松地设置标签。这样您就可以删除整个if let sizeLabel = cell.viewWithTag(201) as? UILabel舞蹈。