You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift AppIntents与Shortcuts跳转指定视图失效问题求助

问题原因及解决方案

核心问题分析

  • App结构体冗余代码干扰:ThingIntentNavApp中引用了未定义的dataStore,且冗余的onAppear逻辑会打乱状态判断流程。
  • 后台唤醒时状态监听缺失:当App处于后台被CreateNewThing快捷方式唤醒时,ThingListView的onAppear不会触发,导致无法检测到跳转状态的变化。
  • 状态管理混用冲突:同时使用@AppStorage和自定义DataStore,造成状态同步不一致。

分步修复方案

1. 清理App结构体无效代码

移除ThingIntentNavApp中冗余的状态变量和无效逻辑:

@main
struct ThingIntentNavApp: App {
    var body: some Scene {
        WindowGroup {
            ThingListView()
        }
        .modelContainer(for: [Thing.self])
    }
    
    init() {
        print(URL.applicationSupportDirectory.path(percentEncoded: false))
        ThingShortcuts.updateAppShortcutParameters()
    }
}

2. 统一状态管理,改用ObservableObject监听

将DataStore作为唯一状态源,替换@AppStorage的混用:

  • 修改CreateNewThing Intent,直接操作全局状态:
struct CreateNewThing: AppIntent {
    static var title: LocalizedStringResource = "Create New Thing"
    static var description = IntentDescription("Opens the app and moves to the Add Thing screen.")
    static var openAppWhenRun: Bool = true

    @MainActor
    func perform() async throws -> some IntentResult {
        DataStore.shared.navigateToThingAddView = true
        return .result()
    }
}
  • 修改ThingListView,添加状态变化监听,覆盖首次启动和后台唤醒场景:
// 顶部补充导入Combine
import Combine

struct ThingListView: View {
    @Environment(\.modelContext) private var context
    
    @Query(sort: \Thing.name) var things: [Thing]
    @State private var selectedThing: Thing?
    @State private var showThingAddView: Bool = false
    @ObservedObject private var dataStore = DataStore.shared
    
    var body: some View {
        NavigationSplitView {
            // 原有顶部HStack代码保持不变
            HStack {
                Text("Things")
                    .font(.title).fontWeight(.bold)
                    .padding(.leading, 20)
                Spacer()
                
                Menu {
                    Button(action: {
                        showThingAddView = true
                    }, label: {
                        Label("Add Thing", systemImage: "plus")
                    })
                } label: {
                    Image(systemName: "ellipsis.circle")
                        .font(.system(size: 30))
                }
                .padding(.trailing)
            }
            
            VStack {
                List(selection: $selectedThing) {
                    ForEach(things) { thing in
                        NavigationLink(destination: ThingDetailView(selectedThing: thing)) {
                            Text(thing.name)
                        }
                    }
                }
                .fullScreenCover(isPresented: $showThingAddView) {
                    ThingAddView()
                }
            }
            .onAppear {
                if things.isEmpty {
                    createSampleThings()
                }
                checkAndTriggerNavigation()
            }
            // 监听状态变化,后台唤醒时也能触发跳转
            .onReceive(Just(dataStore.navigateToThingAddView)) { shouldNavigate in
                if shouldNavigate {
                    checkAndTriggerNavigation()
                }
            }
        } detail: {
            VStack {
                if selectedThing != nil {
                    ThingDetailView(selectedThing: selectedThing)
                } else {
                    WelcomeView()
                }
            }
        }
    }
    
    private func checkAndTriggerNavigation() {
        if dataStore.navigateToThingAddView {
            showThingAddView = true
            dataStore.navigateToThingAddView = false
        }
    }
    
    // 原有createSampleThings方法保持不变
    func createSampleThings() {
        let thing1 = Thing(
            name: "To Kill a Mockingbird",
            comment: "A classic novel set in the American South.",
            recordType: "Harper Lee",
            count: 5
        )
        
        let thing2 = Thing(
            name: "1984",
            comment: "A dystopian novel.",
            recordType: "George Orwell",
            count: 4
        )
        
        let thing3 = Thing(
            name: "The Great Gatsby",
            comment: "A novel about the American Dream.",
            recordType: "F. Scott Fitzgerald",
            count: 4
        )
        
        let thing4 = Thing(
            name: "Pride and Prejudice",
            comment: "A romance novel set in Regency England.",
            recordType: "Jane Austen",
            count: 5
        )
        
        let thing5 = Thing(
            name: "The Catcher in the Rye",
            comment: "A novel about teenage alienation.",
            recordType: "J.D. Salinger",
            count: 3
        )
        
        context.insert(thing1)
        context.insert(thing2)
        context.insert(thing3)
        context.insert(thing4)
        context.insert(thing5)
        
        do {
            try context.save()
        } catch {
            print("Error saving data: \(error)")
        }
    }
}

修复效果

触发Create New Thing快捷方式时,无论App处于完全关闭还是后台运行状态,都会自动打开并跳转至ThingAddView,状态流转逻辑统一可靠。

内容的提问来源于stack exchange,提问作者JohnSF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:29:57