Ipad SwiftUI/iOS 13-具有多个场景的通知中心

Ipad SwiftUI/iOS 13-具有多个场景的通知中心,ipad,swiftui,nsnotificationcenter,Ipad,Swiftui,Nsnotificationcenter,随着iOS 13的推出,一个应用程序可以有多个场景。特别是在iPad上,你可以并排运行一个应用程序的两个场景 这会在我的应用程序中使用通知中心产生问题。通知中心事件由所有场景共享。虽然这可能有助于跨场景同步数据,但打算在原始场景中响应的某些事件将由所有两个场景处理 例如,在这个自定义的UIHostingController类中,我有一个函数来处理UIKeyCommands并将通知发布到通知中心 class HostingController: UIHostingController<Con

随着iOS 13的推出,一个应用程序可以有多个场景。特别是在iPad上,你可以并排运行一个应用程序的两个场景

这会在我的应用程序中使用
通知中心
产生问题。
通知中心
事件由所有场景共享。虽然这可能有助于跨场景同步数据,但打算在原始场景中响应的某些事件将由所有两个场景处理

例如,在这个自定义的
UIHostingController
类中,我有一个函数来处理
UIKeyCommands
并将
通知发布到
通知中心

class HostingController: UIHostingController<ContentView> {
    override var keyCommands: [UIKeyCommand]? {
        var result: [UIKeyCommand] = [
        UIKeyCommand(
                title: "New File",
                action: #selector(handleNotification),
                input: "N",
                modifierFlags: [.command],
                discoverabilityTitle: "New File"
            )
        ]
    }

    @objc func handleNotification(sender: UIKeyCommand){
        NotificationCenter.default.post(name: Notification.Name.handleKeyboardShortcut, object: sender.title)

    }
}
然后问题出现了,当在并排运行应用程序的两个场景时按下
Command+N
时,两个场景的
openNewFile
功能都会启动。两个实例都会弹出一个文件选择表。这显然是一种不受欢迎的行为

关于这个问题,我有一些想法

  • 检查场景是否上次交互,如果是,则只调用函数
    openNewFile

  • 处理
    UIKeyCommands
    外部
    HostingController
    ,因为它由所有场景共享。特别是,我想在
    ContentView
    中使用
    addKeyCommand(:)
    等效方法,以便可以动态更改UIkeycommand


  • 但我不太知道如何实现这些。处理此问题的最佳方法是什么?

    它们不是应用程序的两个实例,而是一个应用程序实例的两个场景。只需在AppDelegate中使用您的NotificationCenter观察者,而不是在视图中使用,在您的案例中是两个视图,而是在AppDelegate中使用,它始终是一个视图。@Asperi感谢您的澄清!这样,我就必须确定哪个场景是活动的,或者最后一次交互的,并在其中调用相应的方法。你能举个例子吗?它们不是应用程序的两个实例,而是一个应用程序实例的两个场景。只需在AppDelegate中使用您的NotificationCenter观察者,而不是在视图中使用,在您的案例中是两个视图,而是在AppDelegate中使用,它始终是一个视图。@Asperi感谢您的澄清!这样,我就必须确定哪个场景是活动的,或者最后一次交互的,并在其中调用相应的方法。你能举个例子吗?
    var body: some View {
        ZStack(){
           ...
        }.onReceive(NotificationCenter.default.publisher(for: Notification.Name.handleKeyboardShortcut)) { notification in
                if let shortcutKey = notification.object as? String {
                    switch shortcutKey {
                    case "New File":
                        self.openNewFile()
                    case "Show Panel":
                        self.openConsolePanel()
                    ...
                    default:
                        break
                    }
                }
    }