SwiftUI 视图,使用结构成员初始化闭包说 >'self' 在所有存储的属性初始化之前使用 <
SwiftUI view, initialize closure with struct member says >'self' used before all stored properties are initialized<
我想初始化一个 onTap 闭包,其中应该调用视图模型中的方法。此函数将传递给另一个将调用它的 class。我不知道如何初始化它,因为它不允许我使用自己,如果我尝试使用对视图模型的弱引用,它会说:
'self' used before all stored properties are initialized
here is the code:
typealias OnTabBarTap = (Tab) -> Void
struct TabScreenView: View {
@State var selectedTab: Tab = .BROWSE
@ObservedObject var viewModel: TabScreenViewModel
var onTabItemTap: OnTabBarTap
init(currentSelectedTab: Tab) {
viewModel = TabScreenViewModel(
input: TabScreenInput(
onStart: PassthroughSubject(),
onTabClick: PassthroughSubject()
)
)
onTabItemTap = {
[viewModel](tab: Tab) -> Void in
viewModel.input.onTabClick.send(tab)
}
}
var body: some View {
NavigationView{
VStack{
CurrentView(currentView: $selectedTab)
BottomTabBarView(tabs: $viewModel.tabs, onTap: onTabItemTap)
}
}
.navigationViewStyle(StackNavigationViewStyle())
.onAppear{
self.viewModel.input.onStart.send(true)
}
}
}
试试下面的方法(viewModel是引用类型,所以你可以用它作为临时变量来操作)
init(currentSelectedTab: Tab) {
let vm = TabScreenViewModel(
input: TabScreenInput(
onStart: PassthroughSubject(),
onTabClick: PassthroughSubject()
)
)
self.viewModel = vm
onTabItemTap = {
[vm](tab: Tab) -> Void in
vm.input.onTabClick.send(tab)
}
}
我想初始化一个 onTap 闭包,其中应该调用视图模型中的方法。此函数将传递给另一个将调用它的 class。我不知道如何初始化它,因为它不允许我使用自己,如果我尝试使用对视图模型的弱引用,它会说:
'self' used before all stored properties are initialized here is the code:
typealias OnTabBarTap = (Tab) -> Void
struct TabScreenView: View {
@State var selectedTab: Tab = .BROWSE
@ObservedObject var viewModel: TabScreenViewModel
var onTabItemTap: OnTabBarTap
init(currentSelectedTab: Tab) {
viewModel = TabScreenViewModel(
input: TabScreenInput(
onStart: PassthroughSubject(),
onTabClick: PassthroughSubject()
)
)
onTabItemTap = {
[viewModel](tab: Tab) -> Void in
viewModel.input.onTabClick.send(tab)
}
}
var body: some View {
NavigationView{
VStack{
CurrentView(currentView: $selectedTab)
BottomTabBarView(tabs: $viewModel.tabs, onTap: onTabItemTap)
}
}
.navigationViewStyle(StackNavigationViewStyle())
.onAppear{
self.viewModel.input.onStart.send(true)
}
}
}
试试下面的方法(viewModel是引用类型,所以你可以用它作为临时变量来操作)
init(currentSelectedTab: Tab) {
let vm = TabScreenViewModel(
input: TabScreenInput(
onStart: PassthroughSubject(),
onTabClick: PassthroughSubject()
)
)
self.viewModel = vm
onTabItemTap = {
[vm](tab: Tab) -> Void in
vm.input.onTabClick.send(tab)
}
}