【发布时间】:2018-01-01 15:24:54
【问题描述】:
我有一个 UITableView,当我点击一个单元格时,我将 firebase 中的一个值更新为 true。我还实现了删除 UITableViewCell 的功能。问题是,如果单击(更新)单元格然后删除应用程序崩溃。当我查看 firebase 时,已更新的值尚未被删除(其他所有内容都已删除),只有在单元格已更新时才会发生这种情况。这就是我得到的
// remove task
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let taskToDelete = groupTask[indexPath.row]
if editingStyle == UITableViewCellEditingStyle.delete {
groupTask.remove(at: indexPath.row)
DataService.instance.REF_GROUPS.child(group!.key).child("task").child(taskToDelete.id).removeValue(completionBlock: { (error, refer) in
if error != nil {
} else {
}
})
self.tableView.reloadData()
}
}
// update task value
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) as? GroupTaskCell else { return }
if cell.isSelected == true {
let selected = groupTask[indexPath.row]
DataService.instance.REF_GROUPS.observe(.value) { (snapShot) in
DataService.instance.updateTaskStatus(desiredGroup: self.group!, selected: true, atIndexpath: indexPath.row, childPath: selected.id, handler: { (complete) in
self.tableView.reloadData()
})
}
} else {
}
self.tableView.reloadData()
}
// update task status
func updateTaskStatus(desiredGroup: Group, selected: Bool, atIndexpath: Int, childPath: String, handler: @escaping (_ taskArray: [Task]) -> ()) {
REF_GROUPS.child(desiredGroup.key).child("task").child(childPath).updateChildValues(["selected": selected])
}
编辑!
无法将“NSNull”(0x1b5915f18) 类型的值转换为“NSString”(0x1b5921ad8)。 2018-01-01 17:38:53.431901+0200 WireUp[587:103199] 无法将“NSNull”(0x1b5915f18)类型的值转换为“NSString”(0x1b5921ad8)。 (lldb)
在我删除任务之前,firebase 的样子:
之后:
如您所见,它并未删除已更新的值,而这正是导致崩溃的原因。感谢所有帮助。
func addTask(withTask task: String, andPeople people: String, forUID uid: String, withGroupKey groupKey: String?, selectedStatus selected: Bool, sendComplete: @escaping (_ taskCreated: Bool ) -> ()) {
if groupKey != nil {
REF_GROUPS.child(groupKey!).child("task").childByAutoId().updateChildValues(["taskToDo": task, "peopleToDoTask": people, "senderId": uid, "selected": selected])
sendComplete(true)
} else {
}
}
func updateTaskStatus(desiredGroup: Group, selected: Bool, childPath: String, handler: @escaping (_ taskArray: [Task]) -> ()) {
REF_GROUPS.child(desiredGroup.key).child("task").child(childPath).updateChildValues(["selected": selected])
}
func configureTaskCell(taskToDo task: String, nameForPerson name: String, isSelected: Bool ) {
self.task.text = task
self.name.text = name
if isSelected {
self.chechImg.isHidden = false
} else {
self.chechImg.isHidden = true
}
}
【问题讨论】:
-
能否显示崩溃结果。 . ?
-
我把崩溃结果放在上面
-
我认为您对 cellForRowAtIndexPath: data source 方法有问题,您将 null 值分配给受限字符串。 . .我建议您在所有异常上添加断点,这将指向问题所在的确切行。
标签: ios swift uitableview firebase firebase-realtime-database