【发布时间】:2020-10-22 21:49:07
【问题描述】:
我正在尝试在 SwiftUI 中隐藏和取消隐藏视图,但这似乎很困难。当我隐藏和取消隐藏我的视图时,我无法保持状态的延续。
struct CounterView: View {
var title: String
var delay = 0.5
@State var ticker: Int = 0
@State var visible = IsVisible()
class IsVisible {
var bool: Bool = false
}
var body: some View {
Text("\(title) \(ticker)")
.onAppear {
print("\(title) onAppear")
if !self.visible.bool {
self.visible.bool = true
startCounter()
}
}
.onDisappear {
print("\(title) onDisappear")
self.visible.bool = false
}
}
func startCounter() {
self.ticker += 1
print(self.ticker)
if self.visible.bool {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.startCounter()
}
}
}
}
struct ContentView: View {
@State var hide = false
var body: some View {
VStack {
VStack {
Button {
self.hide.toggle()
} label: {
Text(hide ? "Show" : "Hide")
}
myView()
}
}
}
@ViewBuilder
func myView() -> some View {
let view = CounterView(title: "Test", delay: 0.1)
if hide {
view.hidden()
} else {
view
}
}
}
复制步骤
1. Open app
2. Tap hide
3. Tap show
预期结果
Counter continues from last number When the view is hidden it gets no accidental onAppear callbacks
实际结果
Counter restarts from 0
When hiding the view a new view is created and it gets an onAppear callback
想要的解决方案
理想情况下我会这样做
let view = CounterView(title: "Test", delay: 0.1)
if hide {
view.hidden()
} else {
view
}
甚至更好
CounterView(title: "Test", delay: 0.1).hide(true)
【问题讨论】:
标签: swiftui