【问题标题】:onReceive not Triggered in some casesonReceive 在某些情况下未触发
【发布时间】:2020-05-26 07:27:47
【问题描述】:

下面是我的工作代码:

struct ReaderView: View {
    @State var presentingSettingsSheet = false
    @State var currentDate = Date()

private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
    .autoconnect()
    .eraseToAnyPublisher()

var body: some View {
    let filter = "Showing all stories"

    return NavigationView {
        List {
            Section(header: Text(filter).padding(.leading, -10)) {
                VStack(alignment: .leading, spacing: 10) {
                    TimeBadge(time: 20.0)

                    Text("Title")
                        .frame(minHeight: 0, maxHeight: 100)
                        .font(.title)

                    PostedBy(time: 30.0, user: "Author", currentDate: self.currentDate)
                    }
                .padding()
            }
        }
        .sheet(isPresented: self.$presentingSettingsSheet, content: {
            SettingsView()
        })
        .navigationBarTitle(Text("Stories"))
        .navigationBarItems(trailing:
            Button("Settings") {
                self.presentingSettingsSheet = true

            }
        )
    }
    .onReceive(timer) {
        print($0)
        self.currentDate = $0
    }
}}

但是如果我在List Scope 之后添加onReceive 它不起作用,如果我在navigationBarItems 声明之后添加它就会开始工作。所以我的问题是为什么 onReceive 在代码中放置不同时表现不同。我知道修饰符的顺序会改变最终生成的 UI,但 onReceive 是否相同。 我正在寻找可能的解释。

我正在使用: Xcode 11.5 模拟器 iPhone SE(第 2 代),13.5。

【问题讨论】:

    标签: swift swiftui combine


    【解决方案1】:

    这不是解决方案,也不是解释,只是进一步评论:

    如果你将计时器延长到

    private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
            .autoconnect()
            .print()
            .eraseToAnyPublisher()
    

    你会得到

    receive subscription: (Timer)
    request unlimited
    request unlimited
    receive cancel
    receive subscription: (Timer)
    request unlimited
    request unlimited
    

    如果你把 onReceive 放到列表中 在所有其他地方(如文本或导航)你只会得到

    receive subscription: (Timer)
    request unlimited
    request unlimited
    

    所以我认为在列表中发布者将被取消并重新启动,这可能是“不工作”的原因

    【讨论】:

    • 你是对的,接收取消打印。但它不仅限于 List。
    猜你喜欢
    • 2013-02-21
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2021-07-10
    相关资源
    最近更新 更多