我有一个加载器函数,用可扩展部分填充我的UITableView:
工作正常。数字(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()
}