SwiftUI开发教程系列 - 第十四章:项目实战,创建一个完备的 SwiftUI 应用 ...

勿忘初心做自己  论坛元老 | 2024-11-13 13:01:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1081|帖子 1081|积分 3243

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在这一章,我们将创建一个简单的任务管理应用,名为 MyTasks,用户可以添加、删除和编辑任务,查看完成状态,并实现数据的本地持久化。应用的核心功能包括:


  • 查看任务列表,支持删除和编辑。
  • 添加新任务,支持设置任务标题和完成状态。
  • 管理任务状态,可以将任务标记为“完成”或“未完成”。
  • 数据持久化,使用 Core Data 来存储任务数据。
  • 动画效果,为任务的添加、删除和状态切换添加平滑动画。
我们将渐渐实现应用的各个功能模块,从项目初始化到完成任务的数据存储与管理。
14.1 项目初始化与设置

首先,在 Xcode 中创建一个新的 SwiftUI 项目,并启用 Core Data 功能。

  • 打开 Xcode,选择 File > New > Project。
  • 在模板选择中,选择 App。
  • 输入项目名称(例如 MyTasks)。
  • 选择 Swift 和 SwiftUI 作为编程语言。
  • 勾选 Use Core Data 选项以启用 Core Data。
Xcode 会自动为你创建一个包含 Core Data 设置的基本项目结构。核心数据存储会包含一个 NSManagedObjectContext 实例,帮助你管理持久化对象。接下来我们将根据需求设置我们的数据模型。
14.2 界说数据模型:任务实体
我们需要在 Core Data 中创建一个实体 Task,它包含以下属性:


  • title: String,任务标题。
  • isCompleted: Bool,任务是否已完成。
  • createdAt: Date,任务创建时间。

  • 打开 MyTasks.xcdatamodeld 文件。
  • 添加一个新的实体,命名为 Task。
  • 为 Task 实体添加如下属性:
         
    • title,类型为 String。   
    • isCompleted,类型为 Boolean。   
    • createdAt,类型为 Date。  

Core Data 会自动为我们天生一个 Task 类,继承自 NSManagedObject,它用于表示任务对象。
14.3 任务列表视图:展示任务数据

如今,我们开始实现任务列表视图,该视图将展示全部任务。通过 Core Data 获取任务数据,并通过 @FetchRequest 显示在列表中。用户可以删除任务,标记任务完成与未完成。
代码实现:TaskListView

  1. import SwiftUI
  2. import CoreData
  3. struct TaskListView: View {
  4.    
  5.     // 访问 Core Data 的上下文,允许我们保存或删除任务数据
  6.     @Environment(\.managedObjectContext) private var viewContext
  7.    
  8.     // 使用 @FetchRequest 从 Core Data 获取任务数据,按创建时间排序
  9.     @FetchRequest(
  10.         sortDescriptors: [NSSortDescriptor(keyPath: \Task.createdAt, ascending: true)],
  11.         animation: .default) private var tasks: FetchedResults<Task> // 任务数据
  12.    
  13.     var body: some View {
  14.    
  15.         NavigationView {
  16.    
  17.             List {
  18.    
  19.                 // 使用 ForEach 遍历任务列表并显示每个任务
  20.                 ForEach(tasks) {
  21.     task in
  22.                     HStack {
  23.    
  24.                         // 任务标题,已完成的任务标题加上删除线
  25.                         Text(task.title ?? "无标题")
  26.                             .strikethrough(task.isCompleted, color: .gray) // 标记已完成任务
  27.                             .foregroundColor(task.isCompleted ? .gray : .black)
  28.                         
  29.                         Spacer()
  30.                         
  31.                         // 切换任务完成状态的按钮
  32.                         Button(action: {
  33.    
  34.                             toggleTaskCompletion(task) // 切换任务的完成状态
  35.                         }) {
  36.    
  37.                             Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle")
  38.                                 .foregroundColor(task.isCompleted ? .green : .gray)
  39.                         }
  40.                     }
  41.                 }
  42.                 .onDelete(perform: deleteTasks) // 支持删除任务
  43.             }
  44.             .na
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表