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