How to open to a specific view using home quick actions

孤者浪人 提交于 2020-01-23 12:31:26

问题


I am new to Swift and have been using SwiftUI, not Storyboard.

I set the UIApplicationShortcutItems in the Info.plist and have two quick actions that are able to present an alert with launchOptions.

I am able to switch-case out the quick actions in 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
    }
}

What is the proper way to open a particular view from a home quick action using SwiftUI?


ContentView.swift

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

回答1:


Here is possible approach by steps (tested with Xcode 11.2 / iOS 13.2)

1) Add AppSettings class to store mode of views to be presented by shorcut

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

2) make appSettings scene delegate member to access it and in ContentView and in shortcut delegate and pass it in ContentView as environment object

let appSettings = AppSettings()

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

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

3) activate corresponding mode in shortcut scene delegate

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) Make ContentView present links conditionally based on selected shortcut mode

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


来源:https://stackoverflow.com/questions/59677445/how-to-open-to-a-specific-view-using-home-quick-actions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!