SwiftUI初探

news2024/11/27 17:51:50

      SwiftUI 虽然出现了好几年(1.0好像2019年出的,还有SPM也是同一年),现在已经到从1.0到5.0,但受限于对系统的要求(最低iOS13.0,有的要求17.0及以上),每个版本里面差异也很大,语法和Flutter 的Dart 比较像。空闲之余可以先学习下,给有需要的同学做个参考, 官方也有现成案例,展示效果如图:

地标列表:

import SwiftUI


/// 列表
struct LandmarkList : View {
    
    @Environment(ModelData.self) var modelData
    
    /// 仅展示收藏
    @State private var showFavoritesOnly = false
    
    /// 数据过滤
    private var filterLandmarks:[Landmark] {
        modelData.landmarkData.filter { $0.isFavorite == true || !showFavoritesOnly }
    }
    
    /// 转场设置
    @State private var selectIndex:Int = 0
    @State private var _index:Int? = nil
    
    var body: some View {
        NavigationView {
            List{
                Toggle(isOn: $showFavoritesOnly, label: {
                    Text("Favorites Only")
                })
                
                if selectIndex == 0 {
                    ForEach(filterLandmarks) { landmark in
                        NavigationLink {
                            LandMarkDetail(landmark: landmark)
                        } label: {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
                else{
                    ForEach(filterLandmarks.indices,id:\.self) { index in
                        LandmarkRow(landmark: filterLandmarks[index])
                            .onTapGesture {
                                _index = index
                                debugPrint("onTapGesture:{\(index),\(String(describing: _index))}")
                            }
                    }
                    .sheet(isPresented: .constant(selectIndex > 0 && _index != nil),
                           onDismiss: {
                        _index = nil
                    },
                           content: {
                        if _index != nil && filterLandmarks.count > _index! {
                            LandMarkDetail(landmark: filterLandmarks[_index!])
                        }
                    })
                }
            }
            .navigationBarTitle("Landmarks", displayMode: .large)
            .navigationBarItems(trailing: SegmentButton(selectIndex:$selectIndex))
            .animation(.easeInOut, value: 0.5)
        }
    }
}

#Preview {
    let modelData = ModelData()
    return LandmarkList()
        .environment(modelData)
}

详情:

import SwiftUI


struct LandMarkDetail : View {
    
    @Environment(ModelData.self) var modelData
    var landmark : Landmark
    var landmarkIndex:Int? {
        get{
            modelData.landmarkData.firstIndex { $0.id == landmark.id }
        }
    }
    
    var body: some View {
        @Bindable var modelData = modelData
        
        ScrollView {
            MapView(coordinate: landmark.locationCoordinate).frame(height: 300)
            
            CircleImage(image: landmark.image(forSize: 250))
                .offset(y: -130)
                .padding(.bottom, -130)
            
            VStack(alignment: .leading) {
                HStack{
                    Text(landmark.name)
                        .font(.title)
                    FavoriteButton(isSet: landmarkIndex != nil ? $modelData.landmarkData[landmarkIndex!].isFavorite : .constant(false))
                }
                
                HStack {
                    Text(landmark.park)
                    Spacer()
                    Text(landmark.state)
                }
                .font(.subheadline)
                .foregroundStyle(.secondary)
                
                Divider()
                
                Text("About \(landmark.name)")
                    .font(.title2)
                Text(landmark.description ?? "")
            }
            .padding()
            Spacer()
        }
        .navigationBarTitle(landmark.name, displayMode: .inline)
        .navigationBarItems(trailing: FavoriteButton(isSet: landmarkIndex != nil ? $modelData.landmarkData[landmarkIndex!].isFavorite : .constant(false)))
    }
}

#Preview {
    let modelData = ModelData()
    return LandMarkDetail(landmark: modelData.landmarkData[0])
        .environment(modelData)
}

每天学习一小步,进步一大步,Demo示例 

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

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

相关文章

黑马es0-1实现自动补全功能

1、安装分词器 上github上找人做好的分词器,放到es-plugin数据卷里,然后重启es即可 2、自定义分词器 elasticsearch中分词器(analyzer)的组成包含三部分: character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符 …

【Python编程实战】基于Python语言实现学生信息管理系统

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

若依ruoyi-vue element-ui 横向滚动条 动态横向滚动条

动态横向滚动条 因为每次横向滑动都要到底部,引入插件 https://github.com/mizuka-wu/el-table-horizontal-scroll //动态横向滚动条移入样式 .el-table-horizontal-scrollbar :hover{//高度 变大10%transform: scaleY(1.5) translateY(-10%);//百分之八十亮度&a…

阻塞、非阻塞、同步与异步IO的区别

IO读取数据的过程 如图所示,进程读取数据的过程主要分为两个步骤 1.内核将数据准备好到内核缓冲区 2.内核将数据拷贝到用户态 在上述这两个过程里,进程首先和内核打交道,之后内核再和硬件(如网卡)打交道 阻塞IO 如图所…

将 KNX 接入 Home Assistant 之二 准备软件

写在前面: 在KNX官网也有关于 Home Assistant 的教程,地址是 Get started with Home Assistant x KNX 需要的东西是 a KNX IP Interface or Routera Raspberry Pian SD Card at least 32 GB 安装 Home Assistant 系统 下载镜像: 地址&…

【调试笔记-20240522-Windows-WSL 修改已安装发行版名称】

调试笔记-系列文章目录 调试笔记-20240522-Windows-WSL 修改已安装发行版名称 文章目录 调试笔记-系列文章目录调试笔记-20240522-Windows-WSL 修改已安装发行版名称 前言一、调试环境操作系统:Windows 10 专业版调试环境调试目标 二、调试步骤方法一:修…

3步找回丢失数据,EasyRecovery让数据恢复如此简单!

在数字化时代,数据已成为我们生活和工作中不可或缺的一部分。然而,数据丢失却是一个令人头疼的问题。无论是因为意外删除、硬盘损坏还是系统崩溃,丢失的文件和数据都可能给我们造成巨大的经济损失和时间浪费。因此,如何高效利用现…

Python内置方法串讲:类型转化与实用技巧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、类型转化:从A到B的魔法 二、实用技巧:避免类型错误 三、总结 一…

【安装笔记-20240519-Windows-安装测试 PuTTY】

安装笔记-系列文章目录 安装笔记-20240521-Windows-安装测试 PuTTY 文章目录 安装笔记-系列文章目录安装笔记-20240521-Windows-安装测试 PuTTY 前言一、软件介绍名称:PuTTY主页官方介绍 二、安装步骤测试版本:0.81下载链接安装步骤功能界面 三、应用场…

列表、元组、字典和集合的区别

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面介绍了序列中的列表、元组、字典和集合的应用,下面通过表2对这几个数据序列进行比较。 表2 列表、元组、字典和集合的区别 数 据…

设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 迭代器模式(Iterat…

LiveGBS流媒体平台GB/T28181用户手册-操作日志:HTTP接口记录、上级SIP信令、搜索、清空

LiveGBS流媒体平台GB/T28181用户手册-操作日志:HTTP接口记录、上级SIP信令、搜索、清空 1、操作日志1.1、列表1.2、搜索过滤1.3、清空 2、搭建GB28181视频直播平台 1、操作日志 操作日志,记录了HTTP接口调用的记录,还有级联给上级平台,上级平…

Ant Design Vue中 a-table 嵌套子表格

需求:在父表格中嵌套子表格,当点击展开某一行时,有展开的关闭当前展开行。使用a-table中的expandedRowKeys 属性和expand 方法。链接:Ant Design Vue 一、属性说明: expandedRowKeys:这个主要是控制展开某行…

ubuntu strace命令

strace 是 Linux 系统中的一个调试工具,用于跟踪并记录系统调用(system calls)和信号(signals)。在 Ubuntu 中,strace 命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互&…

【全开源】智能名片系统源码(Fastadmin+ThinkPHP和Uniapp)

数字时代的新名片,连接未来的桥梁 引言 在数字化浪潮的推动下,传统名片已经逐渐淡出人们的视线。取而代之的是智能名片系统,它以其高效、便捷和智能化的特点,成为了商务交流的新宠。而智能名片系统源码,作为其核心驱…

267 基于matlab的信号处理GUI人机交互

基于matlab的信号处理GUI人机交互,利用GUI功能完成包括振幅调制AM(Amplitude Modulation),双边带调幅信号DSB(double sideband),单边带信号SSB(single sideband )&#x…

Linux线程:管理与控制

一、引言 随着计算机硬件技术的飞速发展,尤其是多核CPU的普及,多线程编程已成为充分利用系统资源、提高程序并发性和响应速度的关键技术。 多线程编程允许一个程序中同时运行多个线程,每个线程可以独立地执行不同的任务。这种并行处理的方式…

白酒:产地的水资源与酿酒工艺的关联性

云仓酒庄豪迈白酒的酿造过程中,水资源与酿酒工艺之间存在着密切的关联性。水是白酒酿造的重要原料之一,其质量和数量直接影响着酿酒工艺的实施和酒的品质。下面我们和云仓酒庄豪迈白酒来深入探讨一下,产地的水资源如何与酿酒工艺产生关联。 首…

【C++课程学习】:二叉树的基本函数实现

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍉二叉树的结构类型: 🍉1.创建二叉树函数(根据数组&am…