我对SwiftUI比较陌生,我正在努力开发我的第一个应用程序.我正在try 使用分段选取器为用户提供在日视图和周视图之间切换的选项.在这些视图的每一个中,都会有特定的用户数据,这些数据应该以图形的形式显示.我遇到的问题是加载数据.我发布了下面的代码,但从我看到的情况来看,问题归结为以下几点:
当加载视图时,它从加载Dayview开始,因为选定的TimeInterval=0.这很好,但是当用户按下分段选取器中的"周"时,数据不会显示.这是由于在从分段选取器运行.onChange()函数之前加载视图的其余部分.由于.onChange是将调用放入viewModel以加载新数据的对象,因此没有数据.如果运行下面的代码,您可以在打印语句中看到这一点.
我本以为视图加载顺序应该是
装载式分段拾取器 如果值已更改,则运行.onChange 加载视图的其余部分 但实际的顺序是
加载分段式拾取器, 加载视图的其余部分(加载图表时此处没有数据!) 如果值已更改,则运行.onChange. 我完全迷路了,所以任何帮助都是最好的!非常感谢!
import SwiftUI
import OrderedCollections
class ViewModel: ObservableObject{
@Published var testDictionary: OrderedDictionary<String, Int> = ["":0]
public func daySelected() {
testDictionary = ["Day View Data": 100]
}
public func weekSelected() {
testDictionary = ["Week View Data": 200]
}
}
struct ContentView: View {
@State private var selectedTimeInterval = 0
@StateObject private var vm = ViewModel()
var body: some View {
VStack {
Picker("Selected Date", selection: $selectedTimeInterval) {
Text("Day").tag(0)
Text("Week").tag(1)
}
.pickerStyle(SegmentedPickerStyle())
.onChange(of: selectedTimeInterval) { _ in
let _ = print("In on change")
//Logic to handle different presses of the selector
switch selectedTimeInterval {
case 0:
vm.daySelected()
case 1:
vm.weekSelected()
default:
print("Unknown Selected Case")
}
}
switch selectedTimeInterval {
case 0:
let _ = print("In view change")
Day_View()
case 1:
let _ = print("In view change")
Week_View(inputDictionary: vm.testDictionary)
default:
Text("Whoops")
}
}
}
}
struct Day_View: View {
var body: some View {
Text("Day View!")
}
}
struct Week_View: View {
@State private var inputDictionary: OrderedDictionary<String,Int>
init(inputDictionary: OrderedDictionary<String,Int>) {
self.inputDictionary = inputDictionary
}
var body: some View {
let keys = Array(inputDictionary.keys)
let values = Array(inputDictionary.values)
VStack {
Text(keys[0])
Text(String(values[0]))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}