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 从家庭快速操作中打开特定视图的正确方法是什么?


内容视图.swift

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: OneView())
                NavigationLink(destination: TwoView())
            }
        }
    }
}
4

1 回答 1

6

这是可能的分步方法(使用 Xcode 11.2 / iOS 13.2 测试)

1)添加AppSettings类以存储要由快捷方式呈现的视图的模式

class AppSettings: ObservableObject {
    enum Mode {
        case one
        case two
    }
    @Published var mode: Mode? = nil
}

2)使appSettings场景委托成员可以访问它并ContentView在快捷方式委托中访问它并将其ContentView作为环境对象传递

let appSettings = AppSettings()

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    let contentView = ContentView().environmentObject(appSettings)
    // ...

3)在快捷场景委托中激活相应模式

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
    }
}

4)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") }
            }
        }
    }
}
于 2020-01-11T06:41:44.737 回答