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())
}
}
}
}
Here is possible approach by steps (tested with Xcode 11.2 / iOS 13.2)
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
}
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)
// ...
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
}
// ...
}
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") }
}
}
}
}