SwiftUI Timer.publish导致整个屏幕刷新

SwiftUI Timer.publish导致整个屏幕刷新,swiftui,swiftui-environment,Swiftui,Swiftui Environment,我目前正在学习combine和MVVM。我的问题是,当我尝试使用timer.publish时,最终我将创建一个stop按钮,它会导致整个屏幕刷新,而不是.onReceive中的文本 我希望有人能给我一些关于我如何错误地使用出版商和观察员的见解 视图: 导入快捷界面 进口联合收割机 结构ApptCardView:视图{ @观察对象变量apptCardVM:ApptCardViewModel @状态变量currentDate=Date() 让timer=timer.publish(每隔:1,在:.m

我目前正在学习combine和MVVM。我的问题是,当我尝试使用timer.publish时,最终我将创建一个stop按钮,它会导致整个屏幕刷新,而不是.onReceive中的文本

我希望有人能给我一些关于我如何错误地使用出版商和观察员的见解

视图:

导入快捷界面
进口联合收割机
结构ApptCardView:视图{
@观察对象变量apptCardVM:ApptCardViewModel
@状态变量currentDate=Date()
让timer=timer.publish(每隔:1,在:.main上,在:.common中)。自动连接()
var body:一些观点{
VStack{
文本(“\(当前日期)”)
.onReceive(计时器){输入到
self.currentDate=输入
}
选择器(“扣押类型”,选择:$apptCardVM.typeIndex){

ForEach(0..如果只想刷新身体的一部分,则将该部分分离到专用子视图中,例如:

struct ApptCardView: View {

    @ObservedObject var apptCardVM: ApptCardViewModel

    var body: some View {
        VStack {
            CurrentDateView()  // << here !!

            Picker("Seizure Type", selection: $apptCardVM.typeIndex) {
            ForEach(0..<apptCardVM.typeChoice.count) {
                Text(self.apptCardVM.typeChoice[$0])
            }
        }.pickerStyle(SegmentedPickerStyle())

        }

    }
}

struct CurrentDateView: View {
    @State private var currentDate = Date()
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var body: some View {
        Text("\(currentDate)")
            .onReceive(timer) { input in
                self.currentDate = input // << refresh only own body !!
        }
    }
}
struct-ApptCardView:View{
@观察对象变量apptCardVM:ApptCardViewModel
var body:一些观点{
VStack{
CurrentDateView()//
import Foundation
import Combine


class ApptCardViewModel: ObservableObject, Identifiable {

    @Published var appt: ApptEvent
    @Published var typeChoice = ["Quick", "Long", "FullService"]
    @Published var typeIndex: Int = 0



    private var cancellables = Set<AnyCancellable>()

    init(appt: ApptEvent) {
        self.appt = appt
    }

}
struct ApptCardView: View {

    @ObservedObject var apptCardVM: ApptCardViewModel

    var body: some View {
        VStack {
            CurrentDateView()  // << here !!

            Picker("Seizure Type", selection: $apptCardVM.typeIndex) {
            ForEach(0..<apptCardVM.typeChoice.count) {
                Text(self.apptCardVM.typeChoice[$0])
            }
        }.pickerStyle(SegmentedPickerStyle())

        }

    }
}

struct CurrentDateView: View {
    @State private var currentDate = Date()
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var body: some View {
        Text("\(currentDate)")
            .onReceive(timer) { input in
                self.currentDate = input // << refresh only own body !!
        }
    }
}