我有一个具有以下视图的 iOS 应用程序:
struct LoggedInUserView: View{
@ObservedObject var viewModel: LoggedInUserViewModel
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: "")
var body: some View{
//Some specific-to-LoggedInUser UI elements
SharedPortionUserView(sharedPortionViewModel: sharedPortionViewModel)
}
}
struct OtherUserView: View{
@ObservedObject var viewModel: OtherUserViewModel()
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: "")
var body: some View{
//Some specific-to-OtherUser UI elements
SharedPortionUserView(sharedPortionViewModel: sharedPortionViewModel)
}
}
SharedPortionViewModel
在这两种情况下运行相同的函数来加载数据,但它会获取指定用户的信息,具体取决于正在查看的视图。 100% 的时间 LoggedInUserView
被查看时,登录用户的用户名将被传递。这存储在 Keychain
中。
我想做的就是在这两种情况下将相关用户的 userName 传递给 StateObject 的创建,但我发现这做起来非常复杂。我见过的各种方法都涉及视图中的自定义初始值设定项,我想避免这种情况。我也考虑过类似的事情:
var passedUserName: String //tried a variety of different property wrappers
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: passedUserName)
这样父视图可以在加载此视图时传递有问题的用户名,但我认为在初始化时未设置passedUserName以准备传递给
sharedPortionViewModel
存在问题。
我还考虑通过以下方式修改上述方法:
@State private var sharedProfileViewModel: SharedUserProfilePageViewModel?
然后通过
初始化它.onAppear {
if sharedProfileViewModel == nil {
sharedProfileViewModel = SharedUserProfilePageViewModel(userName: userName)
}
}
但这感觉很奇怪。
我可以在从父视图初始化导航之前创建 viewModel,然后将其作为已创建的视图模型传递,但这感觉很笨拙。
我错过了什么吗?为什么这件事如此复杂?这些真的是实现这一目标的唯一方法吗?我是否涵盖了上面的最佳方法并错误地忽略了它?
您可以隐式初始化
@StateObject
,如下所示:
struct OtherUserView: View {
@StateObject var sharedPortionViewModel: SharedPortionViewModel
init(passedUserName: String) {
self._sharedPortionViewModel = .init(wrappedValue: .init(userName: passedUserName))
}
}