实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(1)

简介: 实战教程·元宇宙来了,准备好你的电子名片了吗?(七)

实战教程·元宇宙来了,准备好你的电子名片了吗?(七)


前提回顾

不知不觉已经到了第七章了,在过往每一个章节中,我们都增加和完成项目的一些功能,让Linkwirld这款产品越来越接近完成品。

一款以用户操作为核心功能的产品,需要包含增删改查4部分功能,在之前的章节中我们已经完成了查看、新增、删除的功能,还缺少对于身份卡进行编辑的功能。编辑操作为用户对于之前创建的内容的调整或者更新,在ToDo、Note等应用当中很是常见。

那么在本章中,我们来完成后编辑相关的操作。

功能分析:新增和编辑页面的区别

很多时候都会有一个疑惑,现在页面和编辑页面到底有没有区别?开发人员究竟只需要维护一个页面还是要维护两个页面?

一般情况下,由于页面样式的相似性,新增和编辑操作在开发的角度上是需要做到共用的。但新增和编辑页面除了数据绑定外没有太大的样式区分时,我们建议可以将样式或者组件抽离出来,然后再单独应用。

视图复用:创建单独的构件

在新增和编辑页面中,我们会发现有几部分视图内容是可以复用的:titleInputView平台输入框、platformPicker平台选择器、indexURLView链接地址。如下图所示:

image.png

因此对于这三部分,我们可以将其抽离出来搭建单独的构件,如此便可以在新增页面和编辑页面都可以引用。而且如果需要修改样式,也只需要修改构件的样式,新增和编辑页面的样式就可以统一变化。

我们创建一个新的文件夹,命名为Artifacts,并且创建3个SwiftUI文件,并为其命名为TitleInputView、PlatformPicker、IndexURLView,如下图所示:

image.png

我们先来到TitleInputView文件,将原来NewView中的titleInputView视图代码复制过来,如下代码所示:


import SwiftUI
struct TitleInputView: View {
    @Binding var title: String
    var body: some View {
        TextField("请输入头衔", text: $title)
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.horizontal)
            .disableAutocorrection(true)
            .autocapitalization(.none)
    }
}
struct TitleInputView_Previews: PreviewProvider {
    static var previews: some View {
        TitleInputView(title: .constant(""))
    }
}

image.png

上述代码中,除了TextField输入框相关代码复制过来,我们还需要完善相关的绑定参数。声明一个用于双向绑定输入框的参数title,并且在TitleInputView预览时给参数赋予默认值。

紧接着来到PlatformPicker视图,将原来NewView中的platformPicker视图代码复制过来,如下代码所示:


import SwiftUI
struct PlatformPicker: View {
    @Binding var platformIcon: String
    @Binding var platformName: String
    let platforms = [
        ("稀土掘金技术社区", "icon_juejin"),
        ("CSDN博客", "icon_csdn"),
        ("阿里云社区", "icon_aliyun"),
        ("华为云社区", "icon_huaweiyun"),
    ]
    var gridItemLayout = [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())]
    var body: some View {
        ScrollView {
            LazyVGrid(columns: gridItemLayout, spacing: 10) {
                ForEach(0 ..< platforms.count, id: .self) { item in
                    if platforms[item].0 == platformName {
                        Image(platforms[item].1)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 48, height: 48)
                            .clipShape(Circle())
                            .overlay(
                                Circle()
                                    .stroke(Color.green, lineWidth: 4)
                            )
                    } else {
                        Image(platforms[item].1)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 48, height: 48)
                            .clipShape(Circle())
                            .onTapGesture {
                                platformIcon = platforms[item].1
                                platformName = platforms[item].0
                            }
                    }
                }
            }
        }
        .padding()
        .background(Color(.systemGray6))
        .cornerRadius(8)
        .padding(.horizontal)
        .frame(maxHeight: 140)
    }
}
struct PlatformPicker_Previews: PreviewProvider {
    static var previews: some View {
        PlatformPicker(platformIcon: .constant("icon_juejin"), platformName: .constant("稀土掘金技术社区"))
    }
}

image.png

上述代码中,我们仍旧讲需要声明双向绑定的变量,如:platformIcon平台图标、platformName平台名称,值得注意的是,原有我们声明的selectedItem完全可以换成判断platformName是否等于点击的名称,减少一个参数。如下代码所示:


platforms[item].0 == platformName


相关文章
|
存储 监控 安全
IT知识百科:什么是域控服务器?
【2月更文挑战第21天】
2586 2
IT知识百科:什么是域控服务器?
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南
|
Linux Shell 网络安全
Debian10.7 自动化安装镜像制作
Debian10.7 自动化安装镜像制作
1664 0
Debian10.7 自动化安装镜像制作
|
机器学习/深度学习 人工智能
一键生成PPT的AI工具介绍
一键生成PPT的AI工具介绍
1453 0
|
Java 数据库连接 Maven
Spring与Mybatis整合&&aop整合pageHelper分页插件1
Spring与Mybatis整合&&aop整合pageHelper分页插件1
305 0
修改vscode侧边栏颜色
修改vscode侧边栏颜色
1130 0
|
弹性计算 网络协议 算法
记一次典型的TCP传输吞吐效率问题
客户在ECS上实现了一个供小图片上传的接口,通过高防->SLB->ECS的网络链路将接口发布给终端用户,但是发现上传的速率很不理想。初看起来像是高防问题,但是通过排查最终发现这是一个典型的TCP传输吞吐量问题,并且是由于后端服务器端的配置而引起,在此记录下排查过程和相关原理。
记一次典型的TCP传输吞吐效率问题
|
机器学习/深度学习 算法
深度学习中的优化算法:从梯度下降到Adam
本文深入探讨了深度学习中的核心——优化算法,重点分析了梯度下降及其多种变体。通过比较梯度下降、动量方法、AdaGrad、RMSProp以及Adam等算法,揭示了它们如何更高效地找到损失函数的最小值。此外,文章还讨论了不同优化算法在实际模型训练中的表现和选择依据,为深度学习实践提供了宝贵的指导。
330 7
|
Java 网络协议
解决Java中的ProtocolException异常的技术实践
解决Java中的ProtocolException异常的技术实践
|
监控 Devops 测试技术
云效DevOps:让每一位开发者都成为“超级英雄”
【6月更文挑战第11天】云效DevOps是面向软件开发者的云原生协作平台,集成代码管理、自动化构建、持续集成/部署、测试管理和监控告警等功能。它简化代码管理,支持Git等版本控制,提供代码质量检查。自动化构建与持续集成加快开发速度,减少错误。例如,通过YAML配置实现Docker中Maven的构建任务。持续部署功能加速代码上线,监控告警确保问题及时处理。团队协作功能促进高效沟通,助力开发者成为项目中的“超级英雄”。
217 3