首页 > 解决方案 > 不正确的单元格信息被推送到下一个视图控制器

问题描述

所以目前我有一个表格视图: 在此处输入图像描述

当我单击一个单元格时,偶尔会提供有关该事件的错误信息。例如,这是当我添加一个额外的事件时

在此处输入图像描述

当我点击这个新事件时,它给出了错误的信息,而是给出了“测试”事件的信息。单元格中的每个名称代表一个事件,其中包含已注册等信息。用户,事​​件时间等。当我点击 asfe 时,给出的信息是与测试相对应的信息。这个错误每隔一段时间就会发生一次,我不知道是什么原因造成的。

import UIKit
import Firebase
class AdminEvents{
    var eventName:String?
    var eventDesc:String?
    var eventStartDate:String?
    var eventEndDate:String?
    var numPeople:Int?
    var numRegister:Int?

    init(evName:String, evDesc:String, evStartDate:String, evEndDate:String, evNumPeople:Int, evNumRegistered:Int){
        self.eventName = evName
        self.eventDesc = evDesc
        self.eventStartDate = evStartDate
        self.eventEndDate = evEndDate
        self.numPeople = evNumPeople
        self.numRegister = evNumRegistered
    }
}

class AdminsEventsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var eventsArray = [String]()
    var actualEvents:[AdminEvents] = []




    @IBOutlet weak var tblEvents: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let id = Auth.auth().currentUser?.uid
         Database.database().reference().child("users").child(id!).child("createdEvents").observe(.value) { snapshot in
                 //self.eventsArray.removeAll()
               print("start")
               print(snapshot.childrenCount)
               let enumerator = snapshot.children
               while let rest = enumerator.nextObject() as? DataSnapshot {
                   self.eventsArray.append(rest.key as! String)
               }
                      Database.database().reference().child("Events").observe(.value) { (data) in
                           let events = data.value as! [String:[String:Any]]
                           for(_,value) in events{
                               print(self.eventsArray)
                               if(self.eventsArray.contains(value["EventName"]! as! String)){
                                   self.actualEvents.append(AdminEvents(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()
                   }
                  self.tblEvents.dataSource = self
                  self.tblEvents.delegate = self

    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("count: "  + "\(eventsArray.count)")
          return eventsArray.count
      }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          let cell = tableView.dequeueReusableCell(withIdentifier: "productstable", for: indexPath)
          cell.textLabel?.text = self.eventsArray[indexPath.row]
          return cell
      }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
           if let destination = segue.destination as? RegisteredUsersViewController {
               destination.events = actualEvents[(tblEvents.indexPathForSelectedRow?.row)!]
               tblEvents.deselectRow(at: tblEvents.indexPathForSelectedRow!, animated: true)

           }
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

您可以看到,在 prepare 方法中,我正在将事件名称推送到下一个视图控制器。

这是firebase结构 在此处输入图像描述

编辑:有人问在 segue 中推送了什么,我忘了添加有这个的类。

class AdminEvents{
var eventName:String?
var eventDesc:String?
var eventStartDate:String?
var eventEndDate:String?
var numPeople:Int?
var numRegister:Int?

init(evName:String, evDesc:String, evStartDate:String, evEndDate:String, evNumPeople:Int, evNumRegistered:Int){
    self.eventName = evName
    self.eventDesc = evDesc
    self.eventStartDate = evStartDate
    self.eventEndDate = evEndDate
    self.numPeople = evNumPeople
    self.numRegister = evNumRegistered
}

}

标签: iosswiftfirebasefirebase-realtime-database

解决方案


在您的prepare(for:sender:)函数中,您假设表格行选择值是触发 segue 的单元格,但这不能保证。

使用sender参数来识别被点击的行会更安全:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? RegisteredUsersViewController, 
       let cell = sender as? UITableViewCell, 
       let indexPath = tblEvents.indexPath(for:cell) {
               destination.events = actualEvents[indexPath.row]
               tblEvents.deselectRow(at: indexPath, animated: true)
           }
    }
}

推荐阅读