实战编程·使用SwiftUI从0到1完成一款iOS笔记App(四)(1)

简介: 实战编程·使用SwiftUI从0到1完成一款iOS笔记App(四)

实战编程·使用SwiftUI从0到1完成一款iOS笔记App(四)


前提回顾

在上几个章节,我们完成了念头笔记的基本页面的编程,并在上一章节中完成新建笔记的交互逻辑。

这几天和读者沟通时收到反馈,念头笔记项目哪怕只有2个页面交互,但是变量的双向绑定很是麻烦,只要使用到@Binding声明变量的视图,在所有用到该视图的页面都需要做双向绑定,这不优雅。

在本章中,基于上一章完成的新建笔记交互逻辑的基础上,我们尝试使用MVVM模式修改代码和完善其他功能。本章内容较多,参数及方法调整可能会导致一堆临时性的BUG,请耐心学习和修改。

项目结构

首先是项目结构部分,目前我们完成了Model模型类ToastView吐司视图ContentView首页NewNoteView新建笔记视图。如下图所示:

image.png

按照项目编程的习惯,我们其实在正式编程前需要建立基础的页面结构,将模型类、视图、实现方法按照文件夹分开。

在Xcode视图窗口右键,选择New Group,创建一个新的文件夹,如下图所示:

image.png

我们将新的文件夹命名为Model,并把Model.swift文件拖到里面,如下图所示:

image.png

同理,我们再创建一个View文件夹、Extension文件夹、ViewModel文件夹,并将ContentView.swiftNewNoteView.swift文件放入View文件夹中,将ToastView.swift放入Extension文件夹中,如下图所示:

image.png

以上便是一个基础的项目的文件结构,Model文件夹中放入需要使用的模型类,View文件夹中放入相应的页面,而ViewModel文件夹放入功能的实现逻辑和方法,这便是之后要使用MVVM开发模式的做法。

至于其他的Swift文件,拓展的功能类可以创建名为Extension的文件夹,封装好的功能类可以放在Utils文件夹,公共类可以放在Constants文件夹......这些都是看项目和个人需要创建和使用。

Model

Model是我们的模型类,用于定义数据及其类型,由于我们需要用到MVVM开发模式,因此Model文件中只需要定义简单的参数就行了。如下代码所示:

import Foundation
import SwiftUI
struct NoteModel: Identifiable,Codable{
    var id = UUID()
    var writeTime: String
    var title: String
    var content: String
}

image.png

上述代码中,为了更好说明MVVM开发模式中的Model,我们更改NoteItem模型类名称为NoteModel便于理解。参数重命名的方式为选择参数点击右键,选择Refactor,选择Rename,修改为NoteModel

为了使用NoteModel模型类的序列化数据,NoteModel需要遵循Codable协议。

ViewModel

我们在ViewModel文件夹下创建一个新的Swift文件,命名为ViewModel.swift。如下图所示:

image.png

基础概念

ViewModel是用来干什么的?

简单来说,Model是声明数据模型参数的,View是用来构建页面和基础交互的,ViewModel是用来实现基础功能的,包含念头笔记的增删改查,都是在ViewModel中实现,然后在View视图中调用,做到页面和数据分开。

而我们可以看到在ContentView首页视图和NewNoteView新建笔记视图中有很多参数是需要进行双向绑定的,如果不使用ViewModel的方式,那么页面之间都需要声明相同的参数,并做双向绑定。页面一多,那就和套娃一样,一直“回绑”。

我们创建一个ViewModel类,并遵循ObservableObject协议,如下代码所示:

import Combine
import Foundation
import SwiftUI
class ViewModel: ObservableObject {
}

上述代码中,我们引用Combine框架,Combine为应用处理事件(增删改查)提供了一种声明性的方法。然后我们创建了一个ViewModel类,遵循ObservableObject协议,ObservableObject协议可以在视图外绑定自定义的对象,便于开发者使用。

参数声明

在ViewModel类中,我们声明需要用到的参数,如下代码所示:


class ViewModel: ObservableObject {
    //数据模型
    @Published var noteModels = [NoteModel]()
    //笔记参数
    @Published var writeTime: String = ""
    @Published var title: String = ""
    @Published var content: String = ""
    @Published var searchText = ""
  //判断是否正在搜索
    @Published var isSearching:Bool = false
    //判断是否是新增
    @Published var isAdd:Bool = true
    //打开新建笔记弹窗
    @Published var showNewNoteView:Bool = false
    //打开编辑笔记弹窗
    @Published var showEditNoteView:Bool = false
    //打开删除确认弹窗
    @Published var showActionSheet:Bool = false
    //提示信息
    @Published var showToast = false
    @Published var showToastMessage: String = "提示信息"
}

上述代码中,noteModels为引用NoteModel模型类数据,构建数组。

然后是念头笔记需要用到的参数writeTimetitlecontent,搜索栏用到的参数searchText。当搜索时,可能会由于关键字搜索为空,导致搜索列表变成“缺省图”模式,因此还需要声明一个参数isSearching,判断当前是否处于搜索状态。

很多笔记App开发都会把新建页面和编辑页面分开写,包括网上下载下来的代码基本都是新增、编辑两个页面,而两个页面使用相同的代码。亦或者是干脆就没有编辑页面,只能新增、删除,不能编辑,这都不够优雅。

因此,为了共用页面,我们声明了3个Bool类型的参数isAddshowNewNoteViewshowEditNoteView

isAdd用来 判断当前是新增操作还是编辑操作,showNewNoteView用来绑定打开新增笔记弹窗的触发条件,showEditNoteView用来绑定编辑弹窗的触发条件。

然后是删除操作,删除操作也需要声明参数触发,这里声明的参数名为showActionSheet

最后是Toast提示部分,使用到的两个参数showToast是否展示Toast,以及showToastMessage提示信息内容,我们也在ViewModel里声明。

如此,我们便把所有页面用到的参数都抽离出来,后面就不需要在所有页面都声明一样的变量,且保持代码清晰。


相关文章
|
26天前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
74 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
376 75
|
1月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
65 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
54 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
161 66
|
3月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
127 11
|
4月前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
4月前
|
JSON JavaScript 前端开发
harmony-chatroom 自研纯血鸿蒙OS Next 5.0聊天APP实战案例
HarmonyOS-Chat是一个基于纯血鸿蒙OS Next5.0 API12实战开发的聊天应用程序。这个项目使用了ArkUI和ArkTS技术栈,实现了类似微信的消息UI布局、输入框光标处插入文字、emoji表情图片/GIF动图、图片预览、红包、语音/位置UI、长按语音面板等功能。
354 2
|
4月前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
4月前
|
监控 算法 iOS开发
深入探索iOS函数调用栈:符号化与性能调优实战
在iOS开发中,理解函数调用栈对于性能调优和问题排查至关重要。函数调用栈记录了程序执行过程中的函数调用顺序,通过分析调用栈,我们可以识别性能瓶颈和潜在的代码问题。本文将分享iOS函数调用栈的基本概念、符号化过程以及如何利用调用栈进行性能调优。
64 2

热门文章

最新文章

  • 1
    uniapp云打包ios应用证书的获取方法,生成指南
    28
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    117
  • 3
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    20
  • 4
    iOS各个证书生成细节
    36
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    161
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    74
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    65
  • 10
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    172