从UITableView中删除值会导致崩溃

时间:2018-01-01 15:24:55

标签: ios swift uitableview firebase firebase-realtime-database

我有一个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])
    }

EDIT!

  

无法转换类型的值' NSNull' (0x1b5915f18)到' NSString' (0x1b5921ad8)。   2018-01-01 17:38:53.431901 + 0200 WireUp [587:103199]无法转换类型的值' NSNull' (0x1b5915f18)到' NSString' (0x1b5921ad8)。   (lldb)

删除任务之前,firebase的内容如下: What firebase looks like before I delete the task

之后:And after

正如您所看到的那样,它不会删除已更新的值,而这正是造成崩溃的原因。我感谢所有的帮助。

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
    }
}

2 个答案:

答案 0 :(得分:0)

似乎您提供的代码并不是问题所在。它被正确删除但是当您删除它时,它也会仅使用 selected:true 再次更新。在代码的某处,它会尝试获取其余数据,包括选中:true 但它不在那里;导致崩溃。您可能需要进行一些调试,以查看您实际将所选值更新到数据库的位置并将其删除

答案 1 :(得分:0)

不使用表格视图中的self.tableView.reloadData()委托函数,而是尝试使用UITableView的beginUpdate()endUpdate()方法更新和删除单元格。你不会崩溃,你不会重新加载整个表。在Obj-C中,它看起来像是用于删除和更新单元格:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

[tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects: indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];