当两者都使用视图模型并需要该项来执行一些工作时,我正在努力制定将信息从子项传递回父项的最佳方式。SO上有很多类似的话题,但似乎没有一个能解决我的问题。我知道可能有多种解决方案可以解决这个项目,但没有一种能让我相信是正确的。
父级
当你有一个选择的项目,可以保存它以后屏幕
struct ParentView: View {
@StateObject viewModel = ParentViewModel()
}
class ParentViewModel: : ObservableObject {
@Published var selectedItem: Item?
func saveSelectedItem() {
// some logic to perform the request and save selectedItem, of course when it is not nil
}
}
ChildView
获取所有可能的项,并允许选择稍后应传递给父项的项。
struct ChildView: View {
@StateObject viewModel = ChildViewModel()
**(Problem)**
// presents the list of all the items and highlights the current one (if not nil)
// on click sends the info back to Parent
}
class ChildViewModel: : ObservableObject {
@Published var items: [Item] = []
**(Problem)**
func loadItems() {
// fetches the items and sorts them
}
}
我想做的是将selectedItem
传递给ChildView
,并在列表中选择它时得到通知,但子视图模型需要这样才能正确地对项目进行排序。
问题
- 将
selectedItem
传递给孩子并在ViewModel
中使用的最佳方法是什么
如果我将其作为Binding
传递,则ChildView
拥有它,并且我在ChildViewModel
中要求它根据selectedItem
对项目进行排序。
若我根据ChildViewModel
(项目)和selectedItem
的状态执行一个突出显示所选项目的操作,这不是有点混乱吗?
struct ChildView: View {
@StateObject viewModel = ChildViewModel()
@Binding var selectedItem: Item? // How can I use this in ChildViewModel, I need it to sort fetched items properly
}
- 我想我不应该将绑定传递给
ViewModel
,因为它是SwiftUI框架的一部分
class ChildViewModel: : ObservableObject {
@Published var items: [Item] = []
@Binding var selectedItem: Item? // I guess this is not correct, I don't even know how to pass it here
}
- 我知道我可以使用完成块并用
selectedItem
的wrappedValue
初始化ChildViewModel
,但我很想使用SwiftUI/Component方法
在SwiftUI中,可以使用@Binding和@State的组合将数据传递回父视图。
这里有一个例子:
struct ParentView: View {
@State private var selectedItem: Item?
var body: some View {
VStack {
// Other views...
ChildView(selectedItem: $selectedItem)
}
}
}
struct ChildView: View {
@Binding var selectedItem: Item?
var body: some View {
List {
// List of items...
Button(action: {
self.selectedItem = item
}) {
Text(item.name)
}
}
}
}
在本例中,ChildView具有从父视图传入的selectedItem绑定。当用户点击列表中的某个项目时,selectedItem将使用所选项目进行更新。由于@Binding属性包装,此更改将自动传播回父视图。