swift 接收定时器在NavigationView内不工作

xoefb8l8  于 2023-01-25  发布在  Swift
关注(0)|答案(2)|浏览(143)

我有以下计时器:

struct ContentView: View {
    @State var timeRemaining = 10
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        NavigationView{
            VStack {
                if(self.timeRemaining > 0) {
                    Text("\(timeRemaining)")
                        .onReceive(timer) { _ in
                            if self.timeRemaining > 0 {
                                self.timeRemaining -= 1
                            }
                    }
                } else {
                    Text("Time is up!")
                }
            }
        }
    }
}

如果我删除了NavigationView视图,计时器会更新并工作,但它不会,这是怎么回事?在NavigationView中如何更新它?或者有更好的实践吗?
谢谢

yhived7q

yhived7q1#

最好将观察者附加到无条件视图,如

var body: some View {
        NavigationView{
            VStack {
                if(self.timeRemaining > 0) {
                    Text("\(timeRemaining)")
                } else {
                    Text("Time is up!")
                }
            }
            .onReceive(timer) { _ in        // << to VStack
                if self.timeRemaining > 0 {
                    self.timeRemaining -= 1
                }
            }
        }
    }

**更新:**添加了一些想法(当然,SwiftUI的内部结构只有苹果才知道)。

.onReceive必须附加到NavigationView中的永久显示视图,原因很可能是在条件ViewBuilder中以及UIKit UINavigationController周围的NavigationView Package 器内部。
如果您删除了条件,并在NavigationView内的VStack中有一个带有onReceive的文本视图,则不会收到任何内容
如果条件删除后,它被附加到Text("\(timeRemaining)"),则所有工作(使用Xcode 11.4测试),因为主体中存在状态依赖性。
如果将其附加到常量Text,则主体中没有任何变化,即取决于已更改的状态-timeRemaining,因此SwiftUI渲染引擎将主体解释为静态。

o2gm4chl

o2gm4chl2#

有同样的问题,但不是一对一。我解决了这样:我的内容视图有.onApper {binancemanager.fetch()} --〉我在这里调用,但是我把它移到了@main结构我的应用程序:{WindowsGroup. Vstack. Content.

相关问题