如何在 SwiftUI 中的 WatchOS 中实现 handleUserActivity?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中的 WatchOS 中实现 handleUserActivity?【英文标题】:How to implement handleUserActivity in WatchOS in SwiftUI? 【发布时间】:2021-02-02 19:43:10 【问题描述】:

我已经向我的complicationDescriptors 传递了一个包含我的并发症名称的userInfo 字典,这样我就可以知道用户点击了哪个并发症并将它们启动到该视图。由于其他原因,我正在使用新的@App@WKExtensionDelegateAdaptor,因此我可以在extensionDelegate 中访问handleUserActivity,并且可以解压缩复杂功能的来源,但是如何将它们启动到特定视图在 SwiftUI 中? handleUserActivityseems to be set up 与WKInterfaceControllers 合作?

class ExtensionDelegate: NSObject, WKExtensionDelegate 

    let defaults = UserDefaults.standard
    
    func applicationDidFinishLaunching() 
        //print("ApplicationDidFinishLanching called")
        
        scheduleNextReload()
        
    
    
    
    func applicationWillResignActive() 
        //print("applicationWillResignActive called")
    
    
    func handleUserActivity(_ userInfo: [AnyHashable : Any]?) 
        
        if let complication = userInfo?[TrackerConstants.complicationUserTappedKey] as? String 
            
            if complication == TrackerConstants.recoveryDescriptorKey 
                //What now?
             else if complication == TrackerConstants.exertionDescriptorKey 
                //What now?
            
        
        
    

【问题讨论】:

我正在努力实现同样的目标。你想通了吗?尝试以编程方式导航到新视图。 @alamodey 不,我永远无法让它工作???? 您是否能够传递给handlUserActivity 正在呈现哪个并发症值?我有一个并发症,每分钟显示一个新值,我不知道如何传递正在呈现的值。 【参考方案1】:

在this answer 的启发下,我设法根据userInfo 的点击并发症更新了我的视图。

首先声明一个通知名称:

extension Notification.Name 
    static let complicationTapped = Notification.Name("complicationTapped")

在你的ExtensionDelegate

func handleUserActivity(_ userInfo: [AnyHashable : Any]?) 
    if let complication = userInfo?[TrackerConstants.complicationUserTappedKey] as? String 
        NotificationCenter.default.post(
            name: Notification.Name.complicationTapped,
            object: complication
        )
       

终于在你看来:

struct ContentView: View 
    @State private var activeComplication: String? = nil

    var body: some View 
        NavigationView  // or TabView, etc
        // Your content with NavigationLinks
        
        .onReceive(NotificationCenter.default.publisher(
            for: Notification.Name.complicationTapped
        ))  output in
            self.activeComplication = output.object as? String
        
    

有关如何从此处激活视图的更多信息,请参阅Programmatic navigation in SwiftUI

【讨论】:

以上是关于如何在 SwiftUI 中的 WatchOS 中实现 handleUserActivity?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WatchOS 的 SwiftUI 列表中删除分隔符?

SwiftUI:当 List 和 ForEach 嵌入 TabView 时 WatchOS 8.1 中的 NavigationView 错误

在SwiftUI中点击watchOS应用程序时如何更改图像

如何在 SwiftUI watchOS 上创建闹钟

watchOS - 如何从扩展委托更新 SwiftUI 视图

在watchOS中使用.listRowBackground时如何将cornerRadius添加到SwiftUI List Cell?