内容提要
文章讨论了在macOS的SwiftUI中使用onOpenURL时,如何避免每次点击都打开新窗口。通过设置preferring和allowing参数,可以激活现有窗口或创建新窗口。解释了这两个参数的含义,以帮助开发者理解事件处理。
延伸解读
理解 preferring 与 allowing 的匹配逻辑
preferring 和 allowing 参数都是字符串集,用于检查视图的 targetContentIdentifier 是否包含这些字符串。preferring 决定视图是否更倾向于处理外部事件,allowing 则允许视图处理事件。空集永远不会匹配,而“*”总是匹配。正确设置这两个参数,可以控制窗口是激活现有实例还是创建新窗口。
避免重复打开新窗口的实践要点
在 WindowGroup 中,为 ContentView 添加 handlesExternalEvents(preferring:allowing:) 修饰符,并传入与 URL 路径相关的字符串。同时,在 Scene 上使用 handlesExternalEvents(matching:) 并传入相同的路径字符串。这样,当收到 onOpenURL 事件时,系统会优先激活已存在的匹配窗口,而不是新建窗口。
targetContentIdentifier 的作用与设置
targetContentIdentifier 是视图的标识符,用于外部事件匹配。在示例中,ContentView 的 targetContentIdentifier 需要与 preferring 和 allowing 中的字符串对应。如果未显式设置,系统可能使用默认值,导致匹配失败。开发者应确保这些标识符一致,以便正确路由事件。
Q&A
如何在SwiftUI中使用onOpenURL避免每次点击都打开新窗口?
可以通过设置preferring和allowing参数来激活现有窗口或创建新窗口。
preferring和allowing参数在onOpenURL中有什么作用?
preferring参数用于检查视图的targetContentIdentifier,以确定视图是否倾向于处理外部事件;allowing参数则用于检查视图是否允许处理事件。
在使用onOpenURL时,空集和'*'的匹配规则是什么?
空集永远不会匹配,而'*'总是匹配。
如何在macOS的SwiftUI中处理外部事件?
可以使用handlesExternalEvents方法结合preferring和allowing参数来处理外部事件。
使用onOpenURL时,如何确保只打开一个窗口?
通过设置handlesExternalEvents的preferring参数来检查现有窗口,并使用allowing参数来允许处理事件。
在SwiftUI中,如何调试onOpenURL的URL?
可以在onOpenURL的perform闭包中打印url,以进行调试。