watchOS 9 SwiftUI下.accessoryCorner复杂功能点击事件处理疑问
处理watchOS 9 SwiftUI中复杂功能点击事件的替代方案
步骤1:创建新的CLKComplicationDescriptor
弃用带userActivity参数的初始化器后,使用基础初始化器定义复杂功能:
let complicationDescriptors = [ CLKComplicationDescriptor( identifier: "accessory_corner_complication", displayName: "我的角落复杂功能", supportedFamilies: [.accessoryCorner] ) ]
将这段代码放在ExtensionDelegate的applicationDidFinishLaunching(),或SwiftUI@main结构体通过WKApplicationDelegateAdaptor关联的代理类中。
步骤2:实现复杂功能数据源的getUserActivity方法
在CLKComplicationDataSource子类中,重写getUserActivity(for:withHandler:)方法,返回绑定自定义数据的NSUserActivity:
override func getUserActivity(for complication: CLKComplication, withHandler handler: @escaping (NSUserActivity?) -> Void) { let activity = NSUserActivity(activityType: "com.yourdomain.accessoryCornerTap") // 传递自定义标识,用于后续区分操作 activity.userInfo = ["target": "cornerAction"] handler(activity) }
用户点击复杂功能时,系统会调用该方法并将返回的活动对象传递给应用。
步骤3:在SwiftUI应用中监听并处理活动
在SwiftUI根视图上添加onContinueUserActivity修饰符,监听自定义活动类型并执行逻辑:
@main struct WatchApp: App { @WKApplicationDelegateAdaptor(ExtensionDelegate.self) var delegate var body: some Scene { WindowGroup { ContentView() .onContinueUserActivity("com.yourdomain.accessoryCornerTap") { userInfo in if let target = userInfo["target"] as? String, target == "cornerAction" { // 在这里执行点击后的操作,如跳转视图、触发状态更新 print("角落复杂功能被点击") } } } } }
补充说明
- watchOS复杂功能不支持iOS小组件的
widgetURL机制,必须通过ClockKit的NSUserActivity路由处理。 - 自定义活动类型需与App Bundle ID关联,确保全局唯一性。
- 该方案适配所有复杂功能类型(包括
.accessoryCorner)。
内容的提问来源于stack exchange,提问作者Mahdi Moqadasi
相关产品推荐
相关产品推荐

