Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 无法显示来自可观察对象的警报_Swiftui_Alert_Combine - Fatal编程技术网

Swiftui 无法显示来自可观察对象的警报

Swiftui 无法显示来自可观察对象的警报,swiftui,alert,combine,Swiftui,Alert,Combine,场景: 我希望能够通过@Published values(networkMessage&hasAlert)显示来自可观察对象的警报()。 丢失网络连接时应触发此警报 通过 显示警报()的主机视图: 可观察对象最初通过case.failure触发警报() 问题:为什么我没有通过 standardWeatherReport.hasAlert不是来自类PublishedWeatherReport。 StandardWeatherReportclass在哪里?我有两个出版商混在一起。 因此,相

场景: 我希望能够通过@Published values(networkMessage&hasAlert)显示来自可观察对象的警报()。 丢失网络连接时应触发此警报
通过 显示警报()的主机视图:

可观察对象最初通过case.failure触发警报()

问题:为什么我没有通过


standardWeatherReport.hasAlert
不是来自类
PublishedWeatherReport

StandardWeatherReport
class

在哪里?我有两个出版商混在一起。
因此,相关警报无法正常运行 我还有多个警报操作符,每个发布者一个。
这是一个糟糕的设计:每个主机只允许一(1)个警报操作员;否则,第二个.alert运算符将覆盖前一个运算符


因此,如果一个警报处于活动状态,下面的非活动警报操作员将立即取消它。

我有多个发布者。上面的代码显示了标准和已发布的天气报告:我把它们混在一起了(打字错误);谢谢你的观察。
import SwiftUI

struct EndPointView: View {
    @EnvironmentObject var settings: Settings
    @ObservedObject var standardWeatherReport = StandardWeatherReport()
    @ObservedObject var publishedWeatherReport = PublishedWeatherReport()
    @ObservedObject var pepBoy = PepBoy()
    @ObservedObject var postMan = PostMan()

    var body: some View {
        Form {
            Text("Chosen One: \(settings.endpointSection)")
            Text("Row Two")
            Text("Row Three")
            Text("Row Four")

        }.onAppear {
            self.acquireData()
        }
        .alert(isPresented: $standardWeatherReport.hasAlert, content: { () -> Alert in
            Alert(title: Text(verbatim: standardWeatherReport.networkMessage!))
        })
    }

    func acquireData() {
        let chosenEndPoint = EndPoints(rawValue: settings.endpointSection)
        switch chosenEndPoint {
            case .standardWeather:
                standardWeatherReport.doStandard()
            case .publishedWeather:
                publishedWeatherReport.doPublish()
            case .postman:
                postMan.doPublishPostMan()
            case .publishpepboy:
                pepBoy.doPublishPep()
            case .none:
                print("none")
        }
    }
}
import Foundation

class PublishedWeatherReport: ObservableObject {
    @Published var networkMessage: String?
    @Published var hasAlert = false
    @Published var weatherReport: String?

    func doPublish() {
        let url = EndPoint.weather.path()
        var request = URLRequest(url: EndPoint.weather.path()!)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase

        // Publisher:
        let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: url!)
            // the dataTaskPublisher output combination is (data: Data, response: URLResponse)
            .map { $0.data }
            .decode(type: Sample.self, decoder: decoder)
            .receive(on: DispatchQueue.main)
            .eraseToAnyPublisher()

        // Subscriber:
        sub = remoteDataPublisher // ...must assign to an iVar to keep alive.
            .sink(receiveCompletion: { completion in
                switch completion {
                case .finished:
                    break
                case .failure(let anError):
                    self.networkMessage = anError.localizedDescription
                    self.hasAlert = true.  // ... unable to host Alert().
                }
            }, receiveValue: { someValue in
                print(".sink() received \(someValue)")
            })
    }
}
(isPresented: $standardWeatherReport.hasAlert)?