当前位置: 首页 > news >正文

实战《从0开始使用SwiftUI搭建记账软件》- 2、SwiftUI 知识点详解与使用场景

SwiftUI 入门精讲:搞懂这些基础知识点,开发 App 不再蒙圈!


✅ 1. @State —— 控制「自己页面里的状态」

作用:用于保存当前视图的临时状态,例如开关、输入框内容、当前选择项等。

使用场景

  • 控制弹窗是否显示

  • 文本输入是否为空

  • 当前选中的 tab、颜色、开关状态等

示例

@State private var isShowingAddForm = falseButton("添加账单") {isShowingAddForm = true
}
.sheet(isPresented: $isShowingAddForm) {AddTransactionView()
}

✅ 2. @Binding —— 子页面/子控件「修改父页面的数据」

作用:当父视图希望子视图“能改我传给你的变量”,就用 @Binding

使用场景

  • 子页面修改父页面的选项

  • 自定义控件回传数据

示例
父视图传递:

@State private var selectedCategory: Category = .foodCategorySelectorView(selected: $selectedCategory)

子视图使用:

struct CategorySelectorView: View {@Binding var selected: Categoryvar body: some View {Picker("类别", selection: $selected) {Text("食物").tag(Category.food)Text("交通").tag(Category.transport)}}
}

✅ 3. @ObservedObject —— 管理「外部对象数据状态」

作用:绑定一个外部数据模型(通常是 ViewModel),当里面的 @Published 值变化时,视图自动刷新。

使用场景

  • ViewModel 中存放账单数组、总支出等

  • 管理业务逻辑和状态

示例

class TransactionViewModel: ObservableObject {@Published var transactions: [Transaction] = []
}

视图中使用:

@ObservedObject var viewModel = TransactionViewModel()List(viewModel.transactions) { item inText(item.title)
}

✅ 4. @EnvironmentObject —— 全局共享数据

作用:用于在多个页面间共享同一个对象(如用户信息、主题配置、购物车等),不需要一层层传值。

使用场景

  • 用户登录信息

  • 应用主题配置

  • 全局账单数据模型

设置方式

在入口处 .environmentObject() 注入:

@main
struct BookkeepingApp: App {@StateObject var viewModel = TransactionViewModel()var body: some Scene {WindowGroup {ContentView().environmentObject(viewModel)}}
}

在视图中使用:

@EnvironmentObject var viewModel: TransactionViewModel

✅ 5. ZStack —— 「叠放」视图,用于层叠布局

作用:将多个视图按顺序叠加在一起,适合做背景 + 前景 + 浮动按钮等场景。

使用场景

  • 顶部背景色 + 文字

  • 弹窗、浮层、按钮叠加

示例

ZStack {Color.whiteVStack {Text("账单列表")}VStack {Spacer()Button("添加账单") { ... }}
}

✅ 6. VStack —— 「竖直堆叠」视图

作用:将子视图垂直排列,默认居中。

使用场景

  • 表单输入项

  • 标题 + 内容 + 按钮

示例

VStack(alignment: .leading, spacing: 10) {Text("总支出").font(.headline)Text("¥520.00").font(.title)
}

✅ 7. HStack —— 「水平排列」视图

作用:将多个视图水平排列。

使用场景

  • 标题 + 图标

  • 分类 + 金额 + 日期

  • 自定义按钮组

示例

HStack {Image(systemName: "cart.fill")Text("购物")Spacer()Text("¥80.00")
}

✅ 8. SwiftUI 常用基础控件

控件用途示例
Text显示文本内容Text("总支出")
Image显示图片或系统图标Image(systemName: "house")
Button按钮操作Button("保存") { ... }
TextField输入框TextField("输入金额", text: $amount)
DatePicker日期选择器DatePicker("日期", selection: $date)
Toggle开关Toggle("是否重复", isOn: $repeat)
Picker选择器Picker("分类", selection: $type) {...}
List可滚动列表List { ForEach(...) { ... } }
Spacer自动拉伸空隙HStack { Text("A") Spacer() Text("B") }

🎯 小结

如果你刚开始接触 SwiftUI,重点掌握这些就能做出一个完整的 App!它不像 UIKit 那样需要各种代理、回调,只要理解“数据驱动视图”的概念,你写的数据变化,UI就会自动变

http://www.xdnf.cn/news/1235971.html

相关文章:

  • 6.1、Redis多级缓存原理和优化、Redis部分参数优化调整
  • 【超分辨率专题】PiSA-SR:单步Diff超分新突破,即快又好,还能在线调参
  • Linux 摄像头实时抓取:V4L2、FFmpeg 与 GStreamer 全面讲解
  • python工具方法51 视频数据的扩充(翻转、resize、crop、re_fps)
  • Transformer模型用于MT信号相关性预测与分析
  • 《深入浅出RabbitMQ:从零基础到面试通关》
  • 渗透作业4
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 数据结构代码
  • 08.Redis 持久化
  • AOP动态代理
  • #C语言——刷题攻略:牛客编程入门训练(四):运算
  • 大屏项目展示
  • 面向智能体的上下文工程:策略、实现与 LangGraph 实践
  • 09.Redis 常用命令
  • STM32-ESP8266通过MQTT与阿里云通讯
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • Java线程安全类设计思路总结
  • kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?
  • RabbitMQ死信队列与消息幂等性实践指南
  • Rust:如何访问 *.ini 配置文件?
  • 关于车位引导及汽车乘梯解决方案的专业性、系统性、可落地性强的综合设计方案与技术实现说明,旨在为现代智慧停车楼提供高效、安全、智能的停车体验。
  • Noob靶场练习
  • 【python实用小脚本-169】『Python』所见即所得 Markdown 编辑器:写完即出网页预览——告别“写完→保存→刷新”三连
  • Rustdesk中继服务器搭建(windows 服务器)
  • SQL注入SQLi-LABS 靶场less31-38详细通关攻略
  • Python篇--- Python 的加载、缓存、覆盖机制
  • (FD Conv)Frequency Dynamic Convolution for Dense Image Prediction论文精读(逐段解析)
  • vscode的Remote-SSH插件配置SSH主机方法
  • 构造类型--结构体,共同体联合体,枚举