如何在初始化时将字符串传递给视图模型?

问题描述 投票:0回答:1

我有一个具有以下视图的 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,然后将其作为已创建的视图模型传递,但这感觉很笨拙。

我错过了什么吗?为什么这件事如此复杂?这些真的是实现这一目标的唯一方法吗?我是否涵盖了上面的最佳方法并错误地忽略了它?

ios swift mvvm viewmodel
1个回答
0
投票

您可以隐式初始化

@StateObject
,如下所示:

struct OtherUserView: View {
    @StateObject var sharedPortionViewModel: SharedPortionViewModel

    init(passedUserName: String) {
        self._sharedPortionViewModel = .init(wrappedValue: .init(userName: passedUserName))
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.