ios - 使用 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。
解决方案
推荐阅读
- local-storage - NGXS 和 LocalStorage:如何从本地存储中排除某些数据
- java - 在 mockito 测试用例中使用 @Value 属性
- javascript - 为什么闪亮的默认应用程序会导致 javascript 错误和警告?
- ruby-on-rails - Rails 5:付款成功后重定向到随机页面
- javascript - 未捕获的类型错误:$(...).multiselect 不是函数
- html - 如何从 HTML 输入中读取数据并将该数据本地写入文件以供将来访问
- java - 查询解析器构建 Predicate 以过滤内存中的 bean
- qt - 如何在qml中添加一个带有另一个组件的新组件作为参数
- vb.net - VB.Net - 如何在对象列表中调用对象的方法?
- java - 为用户电报机器人发送照片时出现问题