如何解决从主列表到子列表的 SwiftUI + MVVM + NoSQL 编程导航,数据来自 Firestore
我有点坚持使用 NoSQL Firebase Firestore 创建正确的模型(就 MVVM 而言)。
简而言之。我有两个数据列表(父列表和子列表)。比如说“技能”列表和“子技能”列表,这些技能是出于痒技能。用户图片显示技能列表中的技能,然后是所选技能子列表中的子技能。
我可以使用此代码从 Firestore 获取这些列表
获取技能
import SwiftUI
import Firebase
struct Skill: Identifiable {
var id: String = UUID().uuidString
var skillName: String
}
class getSkillList: ObservableObject {
@Published var skills = [Skill]()
private var db = Firestore.firestore()
func fetchData() {
db.collection("skills").addSnapshotListener { (querySnapshot,error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.skills = documents.map { (queryDocumentSnaoshot) -> Skill in
let data = queryDocumentSnaoshot.data()
let skillName = data["skillName"] as? String ?? ""
return Skill(skillName: skillName)
}
}
}
}
struct SkillListView: View {
@ObservedObject private var viewModel = getSkillList()
var body: some View {
List(viewModel.skills) { skill in
Text(skill.skillName)
}.navigationBarTitle("Skills")
.onAppear(){
self.viewModel.fetchData()
}
}
}
And similar to fetch Sub Skill
import SwiftUI
import Firebase
struct SubSkill: Identifiable {
var id: String = UUID().uuidString
var subSkillName: String
}
class getSubSkillList: ObservableObject {
@Published var subSkills = [SubSkill]()
private var db = Firestore.firestore()
func fetchDataS() {
db.collection("skills").document("18GES4eV2LOhzZc38A2M").collection("subSkills").addSnapshotListener { (querySnapshot,error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.subSkills = documents.map { (queryDocumentSnaoshot) -> SubSkill in
let data = queryDocumentSnaoshot.data()
let subSkillName = data["subSkillName"] as? String ?? ""
return SubSkill(subSkillName: subSkillName)
}
}
}
}
struct SubSkillListView: View {
@ObservedObject private var viewModelS = getSubSkillList()
var body: some View {
List(viewModelS.subSkills) { subSkill in
Text(subSkill.subSkillName)
}.navigationBarTitle("Sub Skills")
.onAppear(){
self.viewModelS.fetchDataS()
}
}
}
但是,由于数据是从数据库中提取的,我无法看到列表(在代码中),它会自行添加从技能列表中的技能选择到子技能列表等的导航链接。
我知道它应该通过编程属性以某种方式完成,但我不知道如何(留在 MVVM 模式中)。
非常感谢您的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。