Ios 删除事件后表视图中的奇怪行为

Ios 删除事件后表视图中的奇怪行为,ios,swift,firebase-realtime-database,tableview,swift4,Ios,Swift,Firebase Realtime Database,Tableview,Swift4,我正在开发一个让用户注册志愿活动的应用程序,目前正在让他们查看自己的活动并取消注册 这是用户在请求查看其事件时看到的屏幕,在本例中,这两个事件称为“ok”和“that”(我刚刚创建了一些随机测试事件)。当您单击其中一个时,将显示以下屏幕: 单击“取消注册”时,事件将从registeredEvents中删除,但表视图现在有两个相同的事件 当我单击“上一步”,然后返回到表视图时,一切正常,在本例中只显示“ok”事件,因为另一个事件已被删除。以下是tableview布局的代码: override

我正在开发一个让用户注册志愿活动的应用程序,目前正在让他们查看自己的活动并取消注册

这是用户在请求查看其事件时看到的屏幕,在本例中,这两个事件称为“ok”和“that”(我刚刚创建了一些随机测试事件)。当您单击其中一个时,将显示以下屏幕:

单击“取消注册”时,事件将从registeredEvents中删除,但表视图现在有两个相同的事件

当我单击“上一步”,然后返回到表视图时,一切正常,在本例中只显示“ok”事件,因为另一个事件已被删除。以下是tableview布局的代码:

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