iOS:警报仅触发一次 SwiftUI

时间:2021-07-05 18:21:43

标签: swift swiftui

我有一个需要一些提醒的应用。我已经使用 observableObject 实现了警报触发器,以便它可以从我的协调器类中触发。我遇到的问题是第一个触发器起作用并且警报显示。但是在第一次之后,无论我触发按钮多少次,警报都不会显示。 该视图有一个 webview (UIRepresentable),当在网页上按下按钮时,JS 会在协调器类中触发警报

以下代码的相关部分

带有 showAlerts 类的 MainView:

import SwiftUI
import WebKit

struct MainContentView: View {

    
    @ObservedObject public var viewAlertsInstance = ShowAlerts()
    
    
    var body: some View {

        ZStack {

       SubscriptionViewController(showAlert: viewAlertsInstance)

        }
        .alert(isPresented: $viewAlertsInstance.showAlert) {
            Alert(
                title: Text("Important message"),
                message: Text("Something"),
                dismissButton: .default(Text("Got it!"))
            )
        }


    }

}

class ShowAlerts: ObservableObject {
    @Published var showAlert:Bool = false
    
    func displayAlert() {
        self.showAlert.toggle()
        print(showAlert)
    }
    
}

包含协调器的订阅视图:

import SwiftUI
import WebKit

struct SubscriptionViewController: UIViewRepresentable {
    @StateObject var showAlert: ShowAlerts
    
    
    func makeUIView(context: UIViewRepresentableContext<SubscriptionViewController>) -> WKWebView {

        
        let view = WKWebView()
        view.navigationDelegate = context.coordinator
        
        DispatchQueue.main.async {
            let url = URL(string:"https")!
            let request = URLRequest(url: url)
            
            view.load(request)
        }
        
        context.coordinator.webView = view
        return view
    }
    
    func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<SubscriptionViewController>) {
        
    }
    
    func makeCoordinator() -> CoordinatorSubscription {
        CoordinatorSubscription(self, showAlert: self.showAlert)
    }
    
    typealias UIViewType = WKWebView
}


class CoordinatorSubscription: NSObject, WKNavigationDelegate, WKScriptMessageHandler{
    
    var control: SubscriptionViewController
    var showAlert: ShowAlerts
    
    var webView : WKWebView?

    init(_ control: SubscriptionViewController, showAlert: ShowAlerts) {
        self.control = control
        self.showAlert = showAlert
    }
    
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        processReturnedJS(body: message.body as! String)
    }
    

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }
    
    func processReturnedJS(body: String) {
        

            //Here should toggle the alert
            showAlert.displayAlert()
    }
}

在 processReturnedJS 函数中,showAlert.displayAlert() 应该在每次收到 JS 时显示警报

希望得到任何帮助

谢谢

2 个答案:

答案 0 :(得分:1)

交换你的

@StateObject and @ObservedObject wrappers 

StateObject 用于初始化,ObservedObject 将其初始值作为每个 Apple 文档中的初始化程序中的参数。

然后删除

 var showAlert: ShowAlerts 

在您的协调器中并像这样访问变量

 control.showAlert.displayAlert()

答案 1 :(得分:0)

我认为您颠倒了 @ObservedObject@StateObject 的使用。

当您发现自己为对象创建默认值或起始值时,就像您在 MainContentView 中所做的那样,请使用 @StateObject

当您在视图层次结构的其他位置创建对象并且只想让您的视图观察该对象时,请使用 @ObservedObject