swift - 从containverView错误中快速传递数据
问题描述
Heloo,当我将 contaienerView 与静态 tableview 一起使用时,我遇到了这个问题。我想将我的数据从我的主视图控制器传递到我的表格视图,并且我在它说我的数据为空的地方有这个中断,但它不是空的,因为我已经填充了我想要传递的数据。我使用 firebase 和字典. 这是我的代码:
我的主控制器:
class MainController: UITableViewController, AddPatientController {
private var patientLists = [PatientList]() // empty array buat isi list yg isinya nama pasien
var Segue : String = "PatientName"
var Segue2 : String = "PatientNotes"
let user : User = Auth.auth().currentUser!
private var rootRef : DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
self.rootRef = Database.database().reference()
populateList()
}
private func populateList() {// 5. func buat fetch data dari db ke hp
self.rootRef.child(self.user.emailWithoutSpecialChar).observe(.value) { (snapshot) in
self.patientLists.removeAll()
let pasienListDict = snapshot.value as? [String:Any] ?? [:] //7. ini berarti return buat kl dict nya kosong, ini buat akses ke valuenya yg isinya itu dict[String:Any]
for (key,_) in pasienListDict {
if let pasienlistdict = pasienListDict[key] as? [String:Any]{
if let pasienlist = PatientList(pasienlistdict) {
self.patientLists.append(pasienlist)
// ini buat ngemasukin ke dalem dictionarynya, ini buat store datanya dan ngambil datanya dari firebase db
}
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
} override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == Segue {
let nc = segue.destination as! UINavigationController
let addPatientName = nc.viewControllers.first as! AddListController
addPatientName.delegate = self
}
else if segue.identifier == Segue2 {
guard let indexPath = self.tableView.indexPathForSelectedRow else {return}
let nc = segue.destination as! PasienProfileController
nc.pasien = self.patientLists[indexPath.row]
}
}
这是我应该接收数据的控制器
class NotesController: UITableViewController, AddNotesDelegate {
var pasien : PatientList!
private var rootRef : DatabaseReference!
var Segue1 : String = "AddNotes"
var Segue2 : String = "PasienNotes"
override func viewDidLoad() {
super.viewDidLoad()
self.title = pasien.name // this is the line where my code break cause it says the data is null
self.rootRef = Database.database().reference()
}
我的 pasienprofilecontroller 和我的 pasienProfileTableController(containverView 之一):
class PasienTableController: UITableViewController {
@IBOutlet weak var dataKunjunganLbl: UILabel!
@IBOutlet weak var diagnosaPasienLbl: UILabel!
@IBOutlet weak var alergiPasienLbl: UILabel!
var delegete : PasienTableControllerDelegate?
var patientList = [PatientList]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
}
class PasienProfileController: UIViewController {
@IBOutlet weak var TinggiLbl: UILabel!
@IBOutlet weak var beratLbl: UILabel!
@IBOutlet weak var GolDarahLbl: UILabel!
@IBOutlet weak var NamaLbl: UILabel!
@IBOutlet weak var ImagePic: UIImageView!
var pasien : PatientList!
@IBOutlet weak var ContainerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.ImagePic.makeRounded()
self.NamaLbl.text = pasien.name
}
这是我的故事板的图像,可以清楚地了解我想要做什么
所以我的“病人”视图控制器是我的主控制器,之后它将显示配置文件 pasien 控制器,它是带有包含静态 tableview 的容器视图的 uiview。当我尝试点击“Data Kunjungan Pasien”单元时,它会出现错误
那么我的逻辑有问题吗?为什么它一直说空,而它可以成功地将数据从 Patient 视图显示到 PatientProfileView?
*如果你们想克隆并检查我的错误,这是我的 git https://gitlab.com/afipermanaa/skripsi.git
谢谢您的帮助
解决方案
如果您想使用此代码从 prepareForSegue 传递数据,我不明白
else if segue.identifier == Segue2 {
guard let indexPath = self.tableView.indexPathForSelectedRow else {return}
let nc = segue.destination as! PasienProfileController
nc.pasien = self.patientLists[indexPath.row]
}
到 NotesController 为什么将 "nc" 转换为 PasienProfileController ?它不是同一类
我看不到您在哪里设置了 pasien 值。
希望对你有帮助,如果不是请解释
推荐阅读
- flutter - 如何使用过滤器在颤动中切换深色和白色模式
- git - 发生冲突时如何强制合并成功
- scala - Scala - 方法变量不是不可变的
- flutter - Flutter 在 ListView 中显示数据一次
- alignment - 有没有比用`#noqa`结束每一行更好的方法来禁用对齐代码块上的警告和错误?
- java - 如何将实体对象保存到具有生成索引的初始化 h2 表中?
- c# - 数据集不支持 System.Nullable<>。' 实体框架
- algorithm - 最小的字典字符串
- typescript - Typescript 在数组解构后抱怨变量类型
- python - 引发 NodeNotFoundError