Ios 删除事件后表视图中的奇怪行为
我正在开发一个让用户注册志愿活动的应用程序,目前正在让他们查看自己的活动并取消注册 这是用户在请求查看其事件时看到的屏幕,在本例中,这两个事件称为“ok”和“that”(我刚刚创建了一些随机测试事件)。当您单击其中一个时,将显示以下屏幕: 单击“取消注册”时,事件将从registeredEvents中删除,但表视图现在有两个相同的事件 当我单击“上一步”,然后返回到表视图时,一切正常,在本例中只显示“ok”事件,因为另一个事件已被删除。以下是tableview布局的代码:Ios 删除事件后表视图中的奇怪行为,ios,swift,firebase-realtime-database,tableview,swift4,Ios,Swift,Firebase Realtime Database,Tableview,Swift4,我正在开发一个让用户注册志愿活动的应用程序,目前正在让他们查看自己的活动并取消注册 这是用户在请求查看其事件时看到的屏幕,在本例中,这两个事件称为“ok”和“that”(我刚刚创建了一些随机测试事件)。当您单击其中一个时,将显示以下屏幕: 单击“取消注册”时,事件将从registeredEvents中删除,但表视图现在有两个相同的事件 当我单击“上一步”,然后返回到表视图时,一切正常,在本例中只显示“ok”事件,因为另一个事件已被删除。以下是tableview布局的代码: override
override func viewDidLoad() {
super.viewDidLoad()
yourArray = []
actualEvents = []
let id = Auth.auth().currentUser?.uid
Database.database().reference().child("users").child(id!).child("registeredEvents").observe(.value) { snapshot in
let children = snapshot.children
while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
print(value)
self.yourArray.append(value as! String)
}
Database.database().reference().child("Events").observe(.value) { (data) in
let events = data.value as! [String:[String:Any]]
for(_,value) in events{
if(self.yourArray.contains(value["EventName"]! as! String)){
self.actualEvents.append(PersonalEvents(evName: value["EventName"]! as! String, evDesc: value["EventDescription"]! as! String, evStartDate: value["start time"]! as! String, evEndDate: value["end time"] as! String, evNumPeople: value["NumberOfPeople"]! as! Int, evNumRegistered: value["currentPeople"] as! Int))
}
}
print("Actual events array " + "\(self.actualEvents)")
}
self.tblEvents.reloadData()
}
print(yourArray)
self.tblEvents.dataSource = self
self.tblEvents.delegate = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return yourArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "productstable", for: indexPath)
cell.textLabel?.text = self.yourArray[indexPath.row]
return cell
}
以及“取消注册”按钮(此按钮位于不同的视图控制器中,因为会在不同的视图中显示有关事件的信息):
请让我知道这是否令人困惑,但如果不是,请让我知道为什么会发生这种情况,以及我能做些什么来解决它。- 在数组中附加数据之前,请先删除数组中的项
- 改进:你需要在这些闭包中使用[弱自我]来保护你的记忆
Database.database().reference().child("users").child(id!).child("registeredEvents").observe(.value) { [weak self] snapshot in
let children = snapshot.children
self?.yourArray.removeAll()
while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
print(value)
self?.yourArray.append(value as! String)
}
Database.database().reference().child("Events").observe(.value) { [weak self] (data) in
let events = data.value as! [String:[String:Any]]
self?.actualEvents.removeAll()
for(_,value) in events{
if(self?.yourArray.contains(value["EventName"]! as! String)){
self?.actualEvents.append(PersonalEvents(evName: value["EventName"]! as! String, evDesc: value["EventDescription"]! as! String, evStartDate: value["start time"]! as! String, evEndDate: value["end time"] as! String, evNumPeople: value["NumberOfPeople"]! as! Int, evNumRegistered: value["currentPeople"] as! Int))
}
}
print("Actual events array " + "\(self?.actualEvents)")
}
self?.tblEvents.reloadData()
}
这有点让人困惑,但请尝试在注销事件后调用
tblEvents.reloadData()
,看看这是否有帮助。此外,您不需要到处使用self
。试着读一篇关于它的短文。e、 g.self.tblEvents.dataSource
您不需要在那里使用self
。当您更新数据源时,例如添加我们为您的tableview
删除的对象时,通常您还需要通知您的tableview
更新其视图(单元格)。很抱歉,我应该提到取消注册是在另一个类中,这意味着我无法执行tblEvents.reloadData()我尝试了您所说的,出于某种原因,它将在“if(self?.yourray.contains(value[“EventName”]!as!String)){”行上局部抛出错误线程1:EXC_BAD_指令(code=EXC_I386_INVOP,subcode=0x0)。当我单击“取消注册”或“注册”时会发生这种情况,但偶尔只会发生一次。你知道是什么导致了这种情况吗?好的,我找到了答案,我只是使用了我以前的代码,按照你的建议使用了[weak self],并在第一次闭包之后添加了self?.yourArray.removall()
Database.database().reference().child("users").child(id!).child("registeredEvents").observe(.value) { [weak self] snapshot in
let children = snapshot.children
self?.yourArray.removeAll()
while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
print(value)
self?.yourArray.append(value as! String)
}
Database.database().reference().child("Events").observe(.value) { [weak self] (data) in
let events = data.value as! [String:[String:Any]]
self?.actualEvents.removeAll()
for(_,value) in events{
if(self?.yourArray.contains(value["EventName"]! as! String)){
self?.actualEvents.append(PersonalEvents(evName: value["EventName"]! as! String, evDesc: value["EventDescription"]! as! String, evStartDate: value["start time"]! as! String, evEndDate: value["end time"] as! String, evNumPeople: value["NumberOfPeople"]! as! Int, evNumRegistered: value["currentPeople"] as! Int))
}
}
print("Actual events array " + "\(self?.actualEvents)")
}
self?.tblEvents.reloadData()
}