SwiftUI:如何使用ViewModels将所选项目传递回父项



当两者都使用视图模型并需要该项来执行一些工作时,我正在努力制定将信息从子项传递回父项的最佳方式。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,并在列表中选择它时得到通知,但子视图模型需要这样才能正确地对项目进行排序。

问题

  1. 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
}
  1. 我想我不应该将绑定传递给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
}
  1. 我知道我可以使用完成块并用selectedItemwrappedValue初始化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属性包装,此更改将自动传播回父视图。

相关内容

  • 没有找到相关文章

最新更新