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

news2024/11/14 1:22:38

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

  • 查看任务列表,支持删除和编辑。
  • 添加新任务,支持设置任务标题和完成状态。
  • 管理任务状态,可以将任务标记为“完成”或“未完成”。
  • 数据持久化,使用 Core Data 来存储任务数据。
  • 动画效果,为任务的添加、删除和状态切换添加平滑动画。

我们将逐步实现应用的各个功能模块,从项目初始化到完成任务的数据存储与管理。

14.1 项目初始化与配置

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

  1. 打开 Xcode,选择 File > New > Project。
  2. 在模板选择中,选择 App。
  3. 输入项目名称(例如 MyTasks)。
  4. 选择 Swift 和 SwiftUI 作为编程语言。
  5. 勾选 Use Core Data 选项以启用 Core Data。

Xcode 会自动为你创建一个包含 Core Data 配置的基本项目结构。核心数据存储会包含一个 NSManagedObjectContext 实例,帮助你管理持久化对象。接下来我们将根据需求配置我们的数据模型。

14.2 定义数据模型:任务实体

我们需要在 Core Data 中创建一个实体 Task,它包含以下属性:

  • title: String,任务标题。
  • isCompleted: Bool,任务是否已完成。
  • createdAt: Date,任务创建时间。
  1. 打开 MyTasks.xcdatamodeld 文件。
  2. 添加一个新的实体,命名为 Task。
  3. 为 Task 实体添加如下属性:
    • title,类型为 String。
    • isCompleted,类型为 Boolean。
    • createdAt,类型为 Date。

Core Data 会自动为我们生成一个 Task 类,继承自 NSManagedObject,它用于表示任务对象。

14.3 任务列表视图:展示任务数据

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

代码实现:TaskListView

import SwiftUI
import CoreData

struct TaskListView: View {
   
    // 访问 Core Data 的上下文,允许我们保存或删除任务数据
    @Environment(\.managedObjectContext) private var viewContext
    
    // 使用 @FetchRequest 从 Core Data 获取任务数据,按创建时间排序
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Task.createdAt, ascending: true)],
        animation: .default) private var tasks: FetchedResults<Task> // 任务数据
    
    var body: some View {
   
        NavigationView {
   
            List {
   
                // 使用 ForEach 遍历任务列表并显示每个任务
                ForEach(tasks) {
    task in
                    HStack {
   
                        // 任务标题,已完成的任务标题加上删除线
                        Text(task.title ?? "无标题")
                            .strikethrough(task.isCompleted, color: .gray) // 标记已完成任务
                            .foregroundColor(task.isCompleted ? .gray : .black)
                        
                        Spacer()
                        
                        // 切换任务完成状态的按钮
                        Button(action: {
   
                            toggleTaskCompletion(task) // 切换任务的完成状态
                        }) {
   
                            Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle")
                                .foregroundColor(task.isCompleted ? .green : .gray)
                        }
                    }
                }
                .onDelete(perform: deleteTasks) // 支持删除任务
            }
            .na

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OkHttp网络请求框架

添加依赖 在 build.gradle 文件中添加 OkHttp 依赖&#xff1a; dependencies {implementation("com.squareup.okhttp3:okhttp:4.10.0") }使用OkHttp发起GET请求 同步请求 public class MainActivity extends AppCompatActivity {// Used to load the okhttptes…

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω&#xff0c;它由两部分组成&#xff1a; 叶子结点的数量&#xff1b;叶子结点权重向量的 L 2 L2 L2范数&#xff1b; 公式(…

使用postmain 测试下载文件接口

文章目录 前言使用postmain 测试下载文件接口 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!…

Python函数详解

目录 一、函数的定义 二、函数的特性 三、函数参数 四、返回值 五、文档字符串 六、高级函数 七、偏函数 八、装饰器 总结 在Python编程中&#xff0c;函数是构建程序的基本模块&#xff0c;它提供了一种封装特定任务的方式&#xff0c;使得代码更加模块化、可重用和易…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件

Android Studio 版本 Android Java TextView 实现 点击事件 参考 import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast;public c…

超30万亿消费规模下,低龄VS高龄、他VS她、共性VS个性的市场机会

作者 | NewAgingPro团队 前言 NewAgingPro团队基于多年研究沉淀&#xff0c;发现每个行业都具备为老年人群再次细分的机会&#xff0c;中国的银发经济市场将围绕老年人需求不断往细分场景垂直深耕。具体哪些需求是市场增长的源动力&#xff1f;40岁泛银发群体的需求趋势如何…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

【动手学电机驱动】STM32-FOC(6)基于 IHM03 的无感方波控制

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

CNN实现地铁短时客流预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

SDL打开YUV视频

文章目录 问题1&#xff1a;如何控制帧率&#xff1f;问题2&#xff1a;如何触发退出事件&#xff1f;问题3&#xff1a;如何实时调整视频窗口的大小问题4&#xff1a;YUV如何一次读取一帧的数据&#xff1f; 问题1&#xff1a;如何控制帧率&#xff1f; 单独用一个子线程给主线…

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…

使用vscode 连接linux进行开发

1. 在Vscode中安装扩展功能remote ssh 2. 打开命令窗口 3. 在弹出的命令窗口输入ssh&#xff0c;并从弹出的提示中选择 Add New SSH Host 4. 在弹出的输入窗口中输入类似下面形式的 连接地址&#xff1a; 5. 输入回车后出现下面的对话框&#xff0c;这个对话框是说你要用哪个…

【C++】 C++游戏设计---五子棋小游戏

1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则&#xff1a; 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…

计算机新手练级攻略——如何搜索问题

目录 计算机学生新手练级攻略——如何搜索问题1.明确搜索意图2.使用精确关键词3.使用专业引擎搜索4.利用好技术社区1. Stack Overflow2. GitHub3. IEEE Xplore4. DBLP 5.使用代码搜索工具1. GitHub 代码搜索2. Stack Overflow 代码搜索3. Papers with Code4. IEEE Xplore 6.查阅…

【MySQL】MySQL基础知识复习(下)

前言 上一篇博客介绍了MySQL的库操作&#xff0c;表操作以及CRUD。 【MySQL】MySQL基础知识复习&#xff08;上&#xff09;-CSDN博客 本篇将进一步介绍CRUD操作&#xff0c;尤其是查找操作 目录 一.数据库约束 1.约束类型 1.1NULL约束 1.2UNIQUE&#xff1a;唯一约束 …

从0开始学docker (每日更新 24-11-6)

限制容器运行的资源 限制容器的内存使用 容器的内存包括两部分&#xff1a;物理内存和交换空间&#xff08;swap&#xff09; 用户内存限制 -m,--memory&#xff1a;容器可用的最大内存&#xff0c;该值最低为4MB --memory-swap&#xff1a;允许容器置入磁盘交换空间的内存…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

GIT的基本使用与进阶

GIT的简单入门 一.什么是git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为 Linux 内核开发而设计的。如今&#xff0c;Git 已经成为现代软件开发中…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04&#xff0c;为了提升大型语言模型在不同文化背景下的实用性&#xff0c;华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题&#xff0c;覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…