当应用程序激活时,我需要在我的 ContentView
中调用 loadData
。 ExtensionDelegate
是一个处理应用程序事件的类,例如 applicationDidBecomeActive
。但是我不明白如何在 ExtensionDelegate 中获取 ContentView
。
这是我的ContentView
:
struct ContentView: View {
let network = Network()
@State private var currentIndex: Int = 0
@State private var sources: [Source] = []
var body: some View {
ZStack {
// Some view depends on 'sources'
}
.onAppear(perform: loadData)
}
func loadData() {
network.getSources { response in
switch response {
case .result(let result):
self.sources = result.results
case .error(let error):
print(error)
}
}
}
}
和ExtensionDelegate
:
class ExtensionDelegate: NSObject, WKExtensionDelegate {
func applicationDidFinishLaunching() {
}
func applicationDidBecomeActive() {
// Here I need to call 'loadData' of my ContentView
}
func applicationWillResignActive() {
}
...
最佳答案
我认为最简单的解决方案是使用通知
在 ContentView
中
let needsReloadNotification = NotificationCenter.default.publisher(for: .needsNetworkReload)
var body: some View {
ZStack {
// Some view depends on 'sources'
}
.onAppear(perform: loadData)
.onReceive(needsReloadNotification) { _ in self.loadData()}
}
并且在 ExtensionDelegate
func applicationDidBecomeActive() {
NotificationCenter.default.post(name: .needsNetworkReload, object: nil)
}
和共享的某处
extension Notification.Name {
static let needsNetworkReload = Notification.Name("NeedsReload")
}
关于swiftui - 如何在 Apple Watch 的扩展委托(delegate)中访问 SwiftUI 内容 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62371557/