Skip to main content

80 篇文章 包含 "swiftUI"

查看所有标签

· 预计阅读4分钟

headerimg 有时我们必须在多个视图之间共享数据,比如:ThemeManager。

如果你通过View层级一层一层传递,那实在是太烦了。

SwiftUI 通过 Environment 的概念来解决这个问题, 在那添加公共对象(通常都是ObservableObject), 这些对象会在View chain中共享 。

我们来看一个例子。

· 预计阅读3分钟

headerimg 一开始@ObservedObject是被用来把逻辑从View中分离出去的。

apple期望我们从外部传入那个对象,而不是在View内部创建这个对象。因为在内部创建的话,就将ObservedObject的生命周期和view的生命周期绑定在了一起,View销毁,ObservedObject也会被销毁。

但是实际情况是,我们的View很有可能会被不断的销毁和重建,这种销毁和重建并不是我们的逻辑,而是SwiftUI刷新界面的规则,我们无法干预。随着View的销毁和重建,内部的state也被重置了,这是一个很奇怪的行为。

apple意识到了这一点,加了个新的@StateObject修饰符来解决这个问题。

本文将演示这种奇怪的行为,并介绍如何使用@StateObject。

· 预计阅读3分钟

headerimg

我们使用@State时有一点我们可能并没有注意到,那就是多数时候都是修饰的都是值类型,如果我们用@State去修饰引用类型呢?这就要小心了,因为改变引用类型内部的变量,SwiftUI并不能感知到,所以你的修改可能并不能反应到UI上。

那我们确实需要修饰引用类型呢?这个时候就需要@ObservedObject。

@ObservedObject修饰的对象需要遵循ObservableObject协议,同时需要被监听的属性还需要用@Published修饰。

这在将Foundation的一些对象桥接到SwiftUI中会非常有用。本文我们将用CoreLocation为例来演示一下@ObservedObject。

· 预计阅读7分钟

headerimg 我们上一篇讲了@State,如果我们有其他VIew要修改我们的State呢?

在TodoList demo 中,todos array是struct,是值类型,如果我们传递state到child view,那么传递的是值的copy。当child view修改array时,并不能反映到parent view的array中,所以也看不到变化。

SwiftUI通过@Binding解决这个问题,其本质上可以看成是生成一个对get和set方法的封装struct。

我们将沿用上一个TodoList的demo来看看@Binding的使用。

· 预计阅读6分钟

headerimg @State是一个property wrapper。他负责read/write一个SwiftUI管理的value,当我们write新的value时,SwiftUI会重新计算body。

我们来看一个TodoList的demo。

· 预计阅读3分钟

headerimg 还记得我们自定义UICollectionLayout时做的那种卡片效果么,多个卡片叠在一起,我们可以用滑动手势将顶部卡片移走,显示出下面的卡片。现在我们用swiftui实现同样的功能。