如何使用主屏幕快速操作打开特定视图

5

我是Swift的新手,一直在使用SwiftUI而不是Storyboard。

我在Info.plist中设置了UIApplicationShortcutItems,并有两个快捷操作可以使用launchOptions呈现警报。

我能够在SceneDelegate.swift中切换快捷操作。

func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    switch shortcutItem.type {
    case "QuickAction1":
        OneView() // What do I do to open this SwiftUI struct View?
        break
    case "QuickAction2":
        SecondView() // What do I do to open this SwiftUI struct View?
        break
    default:
        break
    }
}

如何使用SwiftUI从主屏幕快捷操作中打开特定视图?


ContentView.swift

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: OneView())
                NavigationLink(destination: TwoView())
            }
        }
    }
}
1个回答

7

以下是可能的步骤方法(在Xcode 11.2 / iOS 13.2上进行了测试):

  1. 添加AppSettings类以存储快捷方式要呈现的视图模式。
    class AppSettings: ObservableObject {
        enum Mode {
            case one
            case two
        }
        @Published var mode: Mode? = nil
    }
  1. appSettings 场景代理成员变量化,以便在 ContentView 和快捷方式代理中访问它,并将其作为环境对象传递到 ContentView 中。
    let appSettings = AppSettings()
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
        let contentView = ContentView().environmentObject(appSettings)
        // ...
  1. 在快捷场景代理中激活相应的模式
    func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
        switch shortcutItem.type {
        case "QuickAction1":
            appSettings.mode = .one
            break
        case "QuickAction2":
            appSettings.mode = .two
            break
        default:
            break
        }
        // ...
    }
  1. 根据所选的快捷方式模式,使ContentView有条件地显示链接
    struct ContentView: View {
        @EnvironmentObject var appSettings: AppSettings
        
        var body: some View {
            NavigationView {
                VStack {
                    NavigationLink(destination: OneView(),
                                   tag: AppSettings.Mode.one,
                                   selection: $appSettings.mode)
                        { Text("To One") }
                    NavigationLink(destination: TwoView(),
                                    tag: AppSettings.Mode.two,
                                    selection: $appSettings.mode)
                        { Text("To Two") }
                }
            }
        }
    }

它运行得非常好!我不确定为什么在第二步中需要appDelegate,所以我现在省略了该常量。你能解释一下引用的原因吗?无论如何,感谢你详细的回答。 - user1909186
已删除。appDelegate 是为另一个测试而准备的)) - Asperi
我有一个类似的问题。我只有一个快捷方式项目,应该打开一个视图,否则会通过点击NavigationLink导航到该视图。当通过快捷方式项目打开视图时,我希望它具有导航层次结构中前一个视图的标题的返回按钮。 - Dave F
你总是给出很好的解释。问题:在第三步中,为什么你对于这两种情况没有使用 completionHandler(true),并为默认情况使用 false? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接