闽公网安备 35020302035485号


4.操作还能有视觉反馈,用户体验特棒
2.然后通过 Widget Extension 把这个操作"暴露"给控制中心
final class NavigationManager: ObservableObject {
@Published var navigationPath = NavigationPath()
@Published var isAddBookOpen: Bool = false
func openAddBook() {
// 先重置导航路径,确保从根页面开始
navigationPath = NavigationPath()
isAddBookOpen = true
}
}
然后在主视图里绑定这个状态:struct BooksListView: View {
@ObservedObject var navigation: NavigationManager
var body: some View {
NavigationStack(path: $navigation.navigationPath) {
// 你的书籍列表内容
// ...
}
.sheet(isPresented: $navigation.isAddBookOpen) {
AddBookView()
}
}
}
这一步的关键就是把原本散落在各个视图里的导航逻辑统一起来,这样后面的 Intent 才能正确控制页面跳转。import AppIntents
struct GoToAddBookIntent: AppIntent {
// 1. 这个标题会显示在控制中心的选择界面
staticvar title: LocalizedStringResource = "添加新书到书架"
// 2. 注入我们的导航管理器
@Dependency
var navigationManager: NavigationManager
// 3. 重点来了:这里设true表示这个操作会打开应用
staticvar openAppWhenRun: Bool = true
@MainActor
func perform() async throws -> some IntentResult {
// 4. 执行我们的导航动作
navigationManager.openAddBook()
return .result()
}
}
这几个点要注意:4. perform() 方法里写具体要执行的逻辑


import AppIntents
import SwiftUI
import WidgetKit
struct BookShelfControlWidget: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: "com.yourapp.BookShelf.AddBookControl"
) {
// 定义按钮的外观和要执行的动作
ControlWidgetButton(action: GoToAddBookIntent()) {
Label("添加新书", systemImage: "plus.circle.fill")
}
}
.displayName("快速添加书籍")
.description("直接跳转到添加新书页面")
}
}
第四步:解决文件共享问题
6.添加后,控制中心就能看到这个按钮了

struct OpenBookIntent: AppIntent {
staticvar title: LocalizedStringResource = "打开指定书籍"
@Parameter(title: "书籍")
var book: BookEntity
@Dependency
var navigationManager: NavigationManager
// 堆代码 duidaima.com
staticvar openAppWhenRun: Bool = true
func perform() async throws -> some IntentResult {
navigationManager.openBook(book.id)
return .result()
}
}
2. 不打开应用的后台操作struct ToggleReadingModeIntent: AppIntent {
staticvar title: LocalizedStringResource = "切换阅读模式"
// 设成 false,在后台默默执行
staticvar openAppWhenRun: Bool = false
func perform() async throws -> some IntentResult {
// 执行后台操作,比如切换某个设置
UserDefaults.shared.set(!UserDefaults.shared.bool(forKey: "readingMode"),
forKey: "readingMode")
return .result(value: "阅读模式已切换")
}
}
3. 动态切换按钮ControlWidgetToggle(
isOn: UserDefaults.shared.bool(forKey: "readingMode"),
action: ToggleReadingModeIntent()
) {
Label("阅读模式", systemImage: "book.circle")
}
这种切换按钮特别适合设置类的功能,用户一眼就能看到当前状态。<key>NSCameraUsageDescription</key> <string>快速拍照功能需要使用相机</string>数据同步
.点击进入功能页面
.点击控制项