ios - 不正确的单元格信息被推送到下一个视图控制器
问题描述
当我单击一个单元格时,偶尔会提供有关该事件的错误信息。例如,这是当我添加一个额外的事件时
当我点击这个新事件时,它给出了错误的信息,而是给出了“测试”事件的信息。单元格中的每个名称代表一个事件,其中包含已注册等信息。用户,事件时间等。当我点击 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 方法中,我正在将事件名称推送到下一个视图控制器。
编辑:有人问在 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
}
}
解决方案
在您的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)
}
}
}
推荐阅读
- java - Java Methode 命名约定 getX
- swift - 将图像保存到相机胶卷时应用程序崩溃
- flutter - 用于 HTML 内容的 Flutter URL Launcher 无法正常工作
- typescript - webpack module.hot.accept 错误,打字稿不接受字符串数组 TS2345
- html - 使用 RSelenium 打开本地 HTML 文件
- android - 如何使用 xml 在 ImageView 和相对布局上创建圆形图像
- firebase - 使用 Firebase 托管部署 Quasar
- python - 如何从 Python 脚本中运行 Streamlit 应用程序?
- javascript - JS 代码在其他浏览器上工作,但在 IE11 上不显示/工作
- sql - Sql查询检查第1列的子字符串是否包含另一列的值