如何在该视图的 PreviewProvider 的一个视图中使用变量集?
How can I use a variable set in one View in the PreviewProvider for that View?
我有一个名为 homesList
的变量,我在对服务器的函数调用的完成处理程序中设置了该变量。但是,homesList
在 PreviewProvider
中不可访问。如何在 PreviewProvider 中访问 homesList
?
struct HomeRow: View {
var home: Home
@State private var homesList: [Home]
var body: some View {
HStack {
Text(home.homeName)
Spacer()
}
.onAppear {
retrieveHomes(completionHandler: { (json) in
self.homesList = json
})
}
}
}
struct HomeRow_Previews: PreviewProvider {
static var previews: some View {
Group {
HomeRow(home: homesList[0])
}
.previewLayout(.fixed(width: 300, height: 70))
}
}
将模型管理分离到视图模型中并使用依赖注入为预览模拟视图模型提供了可能性。
这是一个可能的方法演示。用 Xcode 12 / iOS 14
测试
struct Home { // just replicated for test
var homeName: String
}
class HomesViewModel: ObservableObject {
@Published var homesList: [Home]
init(homes: [Home] = []) { // default container
self.homesList = homes
}
func fetchHomes() {
guard homesList.isEmpty else { return }
retrieveHomes(completionHandler: { (json) in // load if needed
DispatchQueue.main.async {
self.homesList = json // should be set on main queue
}
})
}
}
struct HomeRow: View {
var home: Home
@ObservedObject var vm: HomesViewModel
var body: some View {
HStack {
Text(home.homeName)
Spacer()
}
.onAppear {
self.vm.fetchHomes()
}
}
}
struct HomeRow_Previews: PreviewProvider {
static var previews: some View {
// prepare mock model with predefined mock homes
let mockModel = HomesViewModel(homes: [Home(homeName: "Mock1"), Home(homeName: "Mock2")])
return Group {
// inject test model via init
HomeRow(home: mockModel.homesList[0], vm: mockModel)
}
.previewLayout(.fixed(width: 300, height: 70))
}
}
我有一个名为 homesList
的变量,我在对服务器的函数调用的完成处理程序中设置了该变量。但是,homesList
在 PreviewProvider
中不可访问。如何在 PreviewProvider 中访问 homesList
?
struct HomeRow: View {
var home: Home
@State private var homesList: [Home]
var body: some View {
HStack {
Text(home.homeName)
Spacer()
}
.onAppear {
retrieveHomes(completionHandler: { (json) in
self.homesList = json
})
}
}
}
struct HomeRow_Previews: PreviewProvider {
static var previews: some View {
Group {
HomeRow(home: homesList[0])
}
.previewLayout(.fixed(width: 300, height: 70))
}
}
将模型管理分离到视图模型中并使用依赖注入为预览模拟视图模型提供了可能性。
这是一个可能的方法演示。用 Xcode 12 / iOS 14
测试struct Home { // just replicated for test
var homeName: String
}
class HomesViewModel: ObservableObject {
@Published var homesList: [Home]
init(homes: [Home] = []) { // default container
self.homesList = homes
}
func fetchHomes() {
guard homesList.isEmpty else { return }
retrieveHomes(completionHandler: { (json) in // load if needed
DispatchQueue.main.async {
self.homesList = json // should be set on main queue
}
})
}
}
struct HomeRow: View {
var home: Home
@ObservedObject var vm: HomesViewModel
var body: some View {
HStack {
Text(home.homeName)
Spacer()
}
.onAppear {
self.vm.fetchHomes()
}
}
}
struct HomeRow_Previews: PreviewProvider {
static var previews: some View {
// prepare mock model with predefined mock homes
let mockModel = HomesViewModel(homes: [Home(homeName: "Mock1"), Home(homeName: "Mock2")])
return Group {
// inject test model via init
HomeRow(home: mockModel.homesList[0], vm: mockModel)
}
.previewLayout(.fixed(width: 300, height: 70))
}
}