首页 > 解决方案 > 使用 NavigationView 和 NavigationLink 的 SwiftUI 快速操作

问题描述

到目前为止创建的代码:

QuickActionViewModel.swift

import Foundation

class QuickActionsViewModel: ObservableObject {
    enum Action: Hashable {
        case one
        case two
        case three
    }

    @Published var action: Action? = nil
}

QATestApp.swift

import CoreData
import SwiftUI
import UIKit

var shortcutItemToHandle: UIApplicationShortcutItem?
let quickActionsViewModel = QuickActionsViewModel()

@main
enum MainApp {
    static func main() {
        QATestApp.main()
    }
}

struct QATestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    @Environment(\.scenePhase) var lifeCycle

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(quickActionsViewModel)
        }
        .onChange(of: lifeCycle) { newLifeCyclePhase in
            if newLifeCyclePhase == .active {
                guard let name = shortcutItemToHandle?.type else { return }
                switch name {
                    case "OneAction":
                        quickActionsViewModel.action = .one
                    case "TwoAction":
                        quickActionsViewModel.action = .two
                    case "ThreeAction":
                        quickActionsViewModel.action = .three
                    default:
                        break
                }
            }
        }
    }
}

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        let sceneConfiguration = UISceneConfiguration(name: "Custom Configuration", sessionRole: connectingSceneSession.role)
        sceneConfiguration.delegateClass = SceneDelegate.self

        return sceneConfiguration
    }
}

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let shortcutItem = connectionOptions.shortcutItem {
            handleShortcutItem(shortcutItem)
        }
    }

    func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
        shortcutItemToHandle = shortcutItem
    }

    private func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem, completionHandler: ((Bool) -> Void)? = nil) {}
}

内容视图.swift

import Combine
import Defaults
import SwiftUI

struct ContentView: View {
    @EnvironmentObject var quickActionsViewModel: QuickActionsViewModel

    var body: some View {
        NavigationView {
            VStack {
                Home()

                // quick actions links
                NavigationLink(destination: Text("One"), tag: .one, selection: self.$quickActionsViewModel.action) { EmptyView() }
                NavigationLink(destination: Text("Two"), tag: .two, selection: self.$quickActionsViewModel.action) { EmptyView() }
                NavigationLink(destination: Text("Three"), tag: .three, selection: self.$quickActionsViewModel.action) { EmptyView() }
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
        .onReceive(self.quickActionsViewModel.$action, perform: { action in
            print(action.debugDescription)
        })
    }
}

Home()当应用程序打开时有一些东西要查看。

我在 info.plist 中静态创建了快捷方式项

<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemIconSymbolName</key>
            <string>book.fill</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>One</string>
            <key>UIApplicationShortcutItemType</key>
            <string>OneAction</string>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemIconSymbolName</key>
            <string>book.fill</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>Twor</string>
            <key>UIApplicationShortcutItemType</key>
            <string>TwoAction</string>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemIconSymbolName</key>
            <string>book.fill</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>Three</string>
            <key>UIApplicationShortcutItemType</key>
            <string>ThreeAction</string>
        </dict>
    </array>

问题一:如果我离开家,将应用程序发送到后台,然后使用其中一种快速操作,它们都不起作用。我已经添加

.onReceive(self.quickActionsViewModel.$action, perform: { action in
    print(action.debugDescription)
})

检查并每次打印一个值

问题 2:如果我触发应用程序打开并正确显示相关视图的快速操作之一。如果我再次发送 bg 并触发另一个快速操作,应用程序会打开旧应用程序(正确,我在此视图打开的情况下发送到后台),显示 Home(),显示所选视图并几乎立即返回主页,与onreceive 打印NIL。

标签: iosswiftswiftui

解决方案


推荐阅读