【问题标题】:SwiftUI – Alert is only showing onceSwiftUI – 警报只显示一次
【发布时间】:2020-01-18 13:03:50
【问题描述】:

我对 SwiftUI 警报视图有一个奇怪的问题。在 ObservableObject 中,我执行了一些网络请求,如果出现错误,我将显示警报。这是我的简化模型:

class MyModel: ObservableObject {
    let objectWillChange = ObservableObjectPublisher()

    @Published var isError: Bool = false

    public func network() {
        Service.call() {
            self.isError = true

            DispatchQueue.main.async {
                self.objectWillChange.send()
            }
        }
    }
}

Service.call 是我的网络请求的虚拟对象。我的观点如下:

struct MyView: View {
    @ObservedObject var model: MyModel

    var body: some View {
        …
        .alert(isPresented: self.$model.isError) {
            print("Error Alert")
            return Alert(title: Text("Alert"))
        }
    }
}

在第一次通话时,一切正常并显示警报。对于所有进一步的调用,print("Error Alert") 将被执行,错误警报会出现在控制台中,但不会显示警报。

有人知道为什么警报只显示一次吗?

【问题讨论】:

    标签: swiftui combine


    【解决方案1】:

    尝试改用(@Published 属性已经有默认发布者)

    class MyModel: ObservableObject {
        @Published var isError: Bool = false
    
        public func network() {
            Service.call() {
    
                DispatchQueue.main.async {
                   self.isError = true // << !!! important place to call
               }
            }
        }
    }
    

    【讨论】:

    • 我已经尝试过了,但它不起作用。我从 Xcode 收到这条消息:[SwiftUI] Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.
    • 注意,在上面的快照代码中只有一个变化,它在主队列上。 self.isError = true 故意移入主队列。
    • 您的解决方案有效。我有更多的@Published 变量,并且只有在主线程中设置了所有(不仅是isError),它才能工作。谢谢!但是您知道为什么它不适用于我的自定义 ObservableObjectPublisher 吗?
    • 我的问题是我使用了很多计算值,这不能是@Published。所以它与 manuelly self.objectWillChange.send() 一起工作得很好,并且很难在默认发布的情况下实现它。
    • 你不需要自定义objectWillChange,因为ObservableObject 有默认值,所以只需在需要的地方调用self.objectWillChange.send()(但只能在主线程上——因为它会激活SwiftUI 更新)
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多