uitableview单元格数据不会从firebase中的新值更新

时间:2018-02-08 21:27:13

标签: ios swift uitableview firebase

我有一个加载器函数,用可扩展部分填充我的UITableView:enter image description here

工作正常。数字(n / total)是总数中完成的数字。使用观察器功能监听firebase,我可以相应地更新这些值,并且已经测试并证实了这一点。

// real time updates for numCompleted/totalNum per category
func observeUserProgress() {
    let userProgress = Database.database().reference().child("userProgress").child(currentUserUID!)
    userProgress.observe(.value, with: {(snapshot) -> Void in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let sectionKey = child.key
            let objStatuses = child.value as! [String:Int]
            self.sections.filter{$0.id==sectionKey}.first?.numCompleted = objStatuses.filter{$0.value == 1}.count
            self.sections.filter{$0.id==sectionKey}.first?.totalNumber = objStatuses.count
            for key in objStatuses.keys {
                Database.fetchObjectiveStatus(userId: self.currentUserUID!, categoryId: sectionKey, objectiveId: key) {
                    (status) in
                    self.sections.filter{$0.id==sectionKey}.first?.objectives.filter{$0.id==key}.first?.completed = status
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                }
            }
        }
    } )
} 

self.sections.filter{$0.id==sectionKey}.first?.numCompleted = objStatuses.filter{$0.value == 1}.count 和     self.sections.filter{$0.id==sectionKey}.first?.totalNumber = objStatuses.count

更新我的内存sections对象,这是一个类别数组,以便于在各自的节标题下嵌套行。

当数据发生变化时,

self.tableView.reloadData()触发,如果用户完成目标,我可以看到数量增加(我从firebase控制台直接编辑状态触发此事件)。

状态在我的内存结构中正确更新,但是,单元格没有更新并继续引用其原始值。我可以通过我的debugPrint()陈述来说明这一点。

在我的cellForRowAt函数中:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let objective:Objective = sections[indexPath.section - 1].objectives[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "objectiveTableCell") as! ObjectiveCustomTableViewCell
    let title = objective.title
    let imgUrl = objective.overlayImgUrl ?? ""
    let objectiveDescription =  objective.description
    let pointsValue = String(describing: objective.pointsValue)
    let objectiveId =  objective.id
    let status = objective.completed
    debugPrint("yes: \(status)")
    cell.initializeObjectives(title: title, detail: objectiveDescription, pointsValue: pointsValue , overlayImgURL: imgUrl , objectiveID: objectiveId, status: status)
    return cell
}

和我的自定义单元格类:

class ObjectiveCustomTableViewCell: UITableViewCell {


    @IBOutlet weak var objectiveTitle: UILabel!
    @IBOutlet weak var objectiveDetailText: UILabel!
    @IBOutlet weak var pointsValue: UILabel!
    @IBOutlet weak var objectiveStatusImageView: UIImageView!

    var overlayImgUrl:String = ""
    var objectiveID:String = ""
    var status:Int = 0

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        switch status {
        case 1:
            self.objectiveStatusImageView.image = UIImage(named: "check")
        case -1:
            self.objectiveStatusImageView.image = UIImage(named: "me")
        default:
            debugPrint(status)
            self.objectiveStatusImageView.image = UIImage(named: "me")
        }

    }


    func initializeObjectives(title:String, detail:String, pointsValue:String, overlayImgURL:String, objectiveID:String, status:Int) {
        self.status = status
        objectiveTitle.text = title
        objectiveDetailText.text = detail
        self.pointsValue.text = pointsValue
        self.overlayImgUrl = overlayImgURL
        self.objectiveID = objectiveID
    }

}

带有yes: status的打印语句始终显示正确的状态,但自定义单元格类中的简单状态打印始终显示为零。另一个奇怪的部分是,只有当tableview首次出现在视图中时,状态在重新加载数据时根本不打印。如果我在firebase中编辑数据以将状态更改为1,我会得到" yes:1"在我的控制台,但我没有看到' 1'来自单元格awakeFromNib函数。

当单元格的状态发生变化时,如何重新初始化笔尖?

编辑

我已将部分定义为<ObjectiveCategory>

的数组

var sections = [ObjectiveCategory]()

我在这里定义了ObjectiveCategory:

class ObjectiveCategory {
    lazy var title: String = ""
    lazy var objectives = [Objective]()
    var collapsed: Bool
    var numCompleted = 0
    lazy var totalNumber = 0
    var id:String = ""

    init(collapsed: Bool = false) {
        self.collapsed = collapsed
    }
}

Objective只是一个初始化的类,可以更轻松地解析JSON。 ObjectiveCategory用于在我的tableview中创建部分。

我通过在函数self.awakeFromNib()中设置局部属性后简单地调用cell.initializeObjectives()来解决这个问题。我想问题就是在我自己的初始化函数之前调用awakeFromNib()。想知道是否有更好的方法来做到这一点。在这个应用程序的2.0中,我计划完全移动到自动布局并完全消除.XIB文件,所以我想我将在不久的将来依赖适当的生命周期方法。

我的黑客:

func initializeObjectives(title:String, detail:String, pointsValue:String, overlayImgURL:String, objectiveID:String, status:Int) {
    self.status = status
    objectiveTitle.text = title
    objectiveDetailText.text = detail
    self.pointsValue.text = pointsValue
    self.overlayImgUrl = overlayImgURL
    self.objectiveID = objectiveID
    self.awakeFromNib()
}

0 个答案:

没有答案