我有一个需要一些提醒的应用。我已经使用 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 时显示警报
希望得到任何帮助
谢谢
答案 0 :(得分:1)
交换你的
@StateObject and @ObservedObject wrappers
StateObject 用于初始化,ObservedObject 将其初始值作为每个 Apple 文档中的初始化程序中的参数。
然后删除
var showAlert: ShowAlerts
在您的协调器中并像这样访问变量
control.showAlert.displayAlert()
答案 1 :(得分:0)
我认为您颠倒了 @ObservedObject
和 @StateObject
的使用。
当您发现自己为对象创建默认值或起始值时,就像您在 MainContentView
中所做的那样,请使用 @StateObject
。
当您在视图层次结构的其他位置创建对象并且只想让您的视图观察该对象时,请使用 @ObservedObject
。