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

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

@Binding属性包装器

这里科普下@State@Binding的用法,@State属性包装器常常用于声明变量的前缀,使用@State属性包装器声明的变量,可以存储当前参数的状态或者值,而@Binding属性包装器常常在其他页面反向绑定@State属性包装器声明的变量。

比如,在首页声明的打开弹窗的参数showNewNoteView,在首页切换showNewNoteView状态用于打开弹窗,因此需要存储其状态

而在新建笔记页面需要关闭弹窗,而开启和关闭弹窗的参数在首页中,于是需要使用@Binding属性包装器进行两个页面之间的双向绑定。

于是使用@Binding声明的showNewNoteView参数在新建笔记切换其状态,在首页中@State声明绑定的同一个参数就可以实时监听更新其状态,就实现了关闭弹窗的交互。

好了,回归主题,我们这里需要修改的将NoteListView笔记列表视图的NoteItem模型类数组使用@Binding进行双向绑定,并在ContentView首页视图中进行绑定,如下代码所示:

@Binding var noteItems: [NoteItem]

image.png

运行预览效果如下图所示:

image.png

提示信息

新建笔记时,当“新建笔记”页面标题输入框为空,以及“内容输入框”为空时,点击“完成”按钮,应用会创建一条空白的笔记,如下图所示:

image.png

这不是我们想要的结果。

新建笔记页面标题、内容输入框都必须输入内容,方可点击创建一条新笔记,当不满足此条件时,则需要提示用户相应的内容,告知用户需要填写和输入。

在移动端常见的方式是使用Toast冒泡提示,我们可以使用ViewModifier协议创建一个Toast视图,首先创建一个新的Swift文件,命名为ToastView

然后录入下面的代码:


import SwiftUI
struct ToastViewModifier: ViewModifier {
    @Binding var present: Bool
    @Binding var message: String
    var alignment: Alignment = .center
    func body(content: Content) -> some View {
        ZStack {
            content
                .zIndex(0)
            VStack {
                Text(message)
                    .padding(Edge.Set.horizontal, 20)
                    .padding(Edge.Set.vertical, 10)
                    .multilineTextAlignment(.center)
                    .foregroundColor(.white)
                    .background(Color.black.opacity(0.7))
                    .cornerRadius(5)
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: alignment)
            .background(Color.gray.opacity(0.1))
            .opacity(present ? 1 : 0)
            .zIndex(1)
            .onChange(of: present) { value in
                if value {
                    // 延迟2秒消失
                    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                        present.toggle()
                    }
                }
            }
        }
    }
}
extension View {
    func toast(present: Binding<Bool>, message: Binding<String>, alignment: Alignment = .center) -> some View {
        modifier(ToastViewModifier(present: present, message: message, alignment: alignment))
    }
}

image.png

上述代码中,我们实现了一个Toast冒泡提示的样式,详细说明见【Swift实用小册19:ExtenExtension扩展的使用】。

回到NewNoteView新建笔记视图,我们先声明Toast需要的参数,如下代码所示:

less

复制代码

@State var showToast = false
@State var showToastMessage: String = ""

上述代码中,showToast参数触发是否展示Toast,showToastMessage参数则显示Toast的内容。调用Toast的方法如下代码所示:

php

复制代码

.toast(present: $showToast, message: $showToastMessage, alignment: .center)

回到逻辑部分,我们需要判断输入的标题title、内容content是否为空,若为空,则展示相应的内容,我们可以写一个方法判读输入内容是否为空,如下代码所示:

arduino

复制代码

// MARK: 判断输入是否为空
func isNull(text: String) -> Bool {
    if text == "" {
        return true
    }
    return false
}

上述代码中,我们创建了一个判断输入的文字是否为空的方法isNull,传入一个String类型的文字,通过判断是否为空,对应返回Bool

我们在点击“完成”按钮时,调用判断方法,如下代码所示:

if isNull(text: title) {
  self.showToastMessage = "请输入标题"
  self.showToast = true
} else if isNull(text: content) {
  self.showToastMessage = "请输入内容"
  self.showToast = true
} else {
  addNote(writeTime: getCurrentTime(), title: title, content: content)
  self.showNewNoteView = false
}

本章项目预览

完成后,我们回到ContentView首页,运行预览效果如下图所示:

本章小结

在本章中,我们实现了新建笔记的方法,当然也传达了一个很重要的编程理念,也就是结构化编程

无论是View视图,还是实现某种功能的方法,我们编程的方式都是抽离出来单独构建。这样编程的好处是当我们需要修改某块内容样式或者逻辑时,可以快速定位到相关的内容,并且尽量使得视图、方法松散分离,变成一块一块的代码块,便于后期扩充

这也是我喜欢SwiftUI的地方,也是喜欢写代码的原因。

接下来的章节,我们将继续完成交互逻辑部分,请保持期待吧~

相关文章
|
5天前
|
运维 iOS开发 Windows
windows电脑备案ios APP获取公钥和证书指纹Sha-1值的方法
在阿里云进行APP备案、在备案IOS端的环节的时候,发现需要我们将p12证书安装在电脑上,再用xcode或或钥匙串访问来获取这个证书的公钥和sha-1值。 但是大部分开发uniapp应用的同学们,或者进行发布的运维人员的电脑都是windows,无法按照阿里云的教程来获取ios的公钥和sha-1。备案就被卡主了。 这里介绍下另一个方法,就是使用香蕉云编来在线上传证书获取。如下图所示,打开香蕉云编后,找到下图这个功能
95 0
|
7月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
216 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
缓存 小程序 视频直播
基于uni-app+vite5+vue3实战短视频+直播+聊天app应用
基于uniapp+vue3+vite5从0-1实战搭建仿抖音/微信直播带货商城。集短视频+聊天+直播功能于一体。实现全屏沉浸式切换短视频/直播,支持编译运行到h5+小程序端+app端。
237 4
|
2月前
|
存储 移动开发 监控
App Trace功能实战:一键拉起、快速安装与免提写邀请码的应用实践
App Trace系统通过一键拉起、快速安装和免提写邀请码三大功能,显著提升用户转化率、安装成功率和邀请注册率。结合深度技术实现与优化,助力公司用户增长,成为移动端核心基础设施。
|
6月前
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
628 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
6月前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
225 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
8月前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
1039 75
|
7月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
227 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
7月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
230 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
9月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
865 11