SwiftUI: Data -Driven UI

看这篇文章之前,最好先看上篇文章 juejin.cn/post/734342...

在上篇文章中我们大致了解了基础 UI 展示,那么你肯定很好奇,数据是怎么驱动 UI 来刷新的呢,这篇文章带你来了解一下常用的几种方式。

比较常见是: @State @Binding @ObserverObject @EnvironmentObject 了解 Swift 的应该都知道@xxx 实质上是 struct 类型的属性包装器

1、@State

最简单的 UI 和 数据关联方式,使用@State 修饰的值, 在SwiftUI 中会自动转成一对setter和getter函数, 对这个属性赋值操作将会触发View的刷新,话不多说看🌰:

点我们点 Test 之后界面会展示 100

2、@Binding

思考一个问题:因为sudokuBrain是类型值,怎么能传递到子页面,在子页面中修改来影响当前页面呢?

@Binding就是来解决这个问题的 会将值类型转换成为 引用类型的定义,给@Binding 修饰的属性赋值, 改变的是他的引用

如蓝色框中所示,我们在SudokuItemRow 中修改Brain就可以上溯到上级UI,来更新整个UI,有点类似C中的指针传递

3、ObservedObject

@State非常适合 struct和enum值类型,可以自动完成状态到UI的更新,比较适合这种比较简单的数据结构,面对更加复杂的页面,也可能各个属性之间彼此耦合,我们应该选择更加灵活的方式例如 @ObserverdObject, 订阅实现是依靠ObjectWillChange以及ObjectWillChange.send()来完成的,简单来看个例如

这样修改model的sudobrain会刷新UI,当然我们也可以使用@published让编译自动生成ObjectWillChange 如下

4、@EnvironmentObject

observedObject很方便,但是或者你想说 我不想进行多个层级的传递值,那么可以使用@EnvironmentObject,这个好像和单例有点像,我们看看代码

这种提供了很大的方便,特别是多个层级逐级传递值的时候,它更像一个context,提供给我们使用

基本上这几种方式完全可以提供我们使用,我们可以根据数据的复杂度,页面的复杂度选择适合自己的方式来处理逻辑和UI

相关推荐
2501_915918413 分钟前
Windows 上开发 React Native iOS,真机调试、Fast Refresh 与打包 ipa
windows·vscode·react native·ios·个人开发·swift·敏捷流程
szp200516 小时前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift
2501_915106321 天前
iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing
ide·vscode·ios·单元测试·个人开发·swift·敏捷流程
东坡肘子1 天前
当应用不再属于特定操作系统 -- 肘子的 Swift 周报 #159
人工智能·swiftui·swift
2501_915106324 天前
Windows 用 KXBuild 开发 iOS 项目,CocoaPods、SPM 怎么处理?
windows·vscode·ios·个人开发·swift·敏捷流程·cocoapods
2501_916008895 天前
Windows 上写第一个 SwiftUI App,KXBuild 空工程起步,跑到 iPhone 真机
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
songgeb6 天前
iOS App支持设置RTL语言的实践
ios·swift·ui kit
2501_915106327 天前
KXApp 的 VS Code 真机调试:按下 Cmd+R 之后发生了什么
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2601_955518187 天前
36. 跨语言:C/C++与Swift&Objective-C混合编程(一)
objective-c·swift·c/c++·混合编程·跨语言
东坡肘子8 天前
谁是 AI-relay App 的真正威胁 -- 肘子的 Swift 周报 #158
人工智能·swiftui·swift