使用 SwiftUI 时在拆分视图上接收应用程序之间焦点更改的通知

Posted

技术标签:

【中文标题】使用 SwiftUI 时在拆分视图上接收应用程序之间焦点更改的通知【英文标题】:Receive notifications for focus changes between apps on Split View when using SwiftUI 【发布时间】:2021-02-10 14:06:01 【问题描述】:

在 iPaOS 拆分视图中显示的应用程序或场景的焦点更改视图中接收通知时我应该注意什么?

当用户将焦点返回给应用程序时,我正在尝试更新视图的一些数据,如 here 所述。

谢谢。

【问题讨论】:

【参考方案1】:

这里有一个解决方案,每当收到UIPasteboard.changedNotification 或更改scenePhase 时更新pasteDisabled

struct ContentView: View 
    @Environment(\.scenePhase) private var scenePhase
    @State private var pasteDisabled = false

    var body: some View 
        Text("Some Text")
            .contextMenu 
                Button(action: ) 
                    Text("Paste")
                    Image(systemName: "doc.on.clipboard")
                
                .disabled(pasteDisabled)
            
            .onReceive(NotificationCenter.default.publisher(for: UIPasteboard.changedNotification))  _ in
                updatePasteDisabled()
            
            .onChange(of: scenePhase)  _ in
                updatePasteDisabled()
            
    

    func updatePasteDisabled() 
        pasteDisabled = !UIPasteboard.general.contains(pasteboardTypes: [aPAsteBoardType])
    

【讨论】:

当应用程序进入后台时,scenePhase 似乎发生了变化,但当应用程序处于拆分视图中时,当应用程序之间的焦点发生变化时,scenePhase 不会发生变化。没有这个,我无法知道应用程序是否有很多焦点。

以上是关于使用 SwiftUI 时在拆分视图上接收应用程序之间焦点更改的通知的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI之HStack和VStack的切换

SwiftUI之HStack和VStack的切换

使用 SwiftUI 接收 APNS 后显示视图

SwiftUI之如何使用@EnvironmentObject在视图之间共享数据

SwiftUI:@Environment 未在视图层次结构中接收提供的值

如何在 swiftUI 中选择项目时在选择器上添加操作?