Tre*_*vör 16 swift swiftui property-wrapper
我正在尝试创建 SwiftUI 支持的自定义属性包装器,这意味着对相应属性值的更改会导致 SwiftUI 视图的更新。这是我所拥有的简化版本:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Run Code Online (Sandbox Code Playgroud)
我看到即使 myObservedObject
包含在我的自定义属性包装器中,SwiftUI 仍然会捕获更改,SomeObservedObject
只要:
DynamicProperty
不幸的是,文档很少,我很难判断这是否仅适用于当前的 SwiftUI 实现。
DynamicProperty
(在 Xcode 中,而不是在线)的文档似乎表明这样的属性是从外部更改导致视图重绘的属性,但是无法保证当您使自己的类型符合此协议时会发生什么。
我可以期待这在未来的 SwiftUI 版本中继续工作吗?
Asp*_*eri 13
好的......这是获得类似东西的替代方法......但作为结构仅DynamicProperty
环绕@State
(强制视图刷新)。
它是一个简单的包装器,但可以通过以下视图刷新来封装任何自定义计算......并且如上所述使用仅值类型。
这是演示(使用 Xcode 11.2 / iOS 13.2 测试):
这是代码:
import SwiftUI
@propertyWrapper
struct Refreshing<Value> : DynamicProperty {
let storage: State<Value>
init(wrappedValue value: Value) {
self.storage = State<Value>(initialValue: value)
}
public var wrappedValue: Value {
get { storage.wrappedValue }
nonmutating set { self.process(newValue) }
}
public var projectedValue: Binding<Value> {
storage.projectedValue
}
private func process(_ value: Value) {
// do some something here or in background queue
DispatchQueue.main.async {
self.storage.wrappedValue = value
}
}
}
struct TestPropertyWrapper: View {
@Refreshing var counter: Int = 1
var body: some View {
VStack {
Text("Value: \(counter)")
Divider()
Button("Increase") {
self.counter += 1
}
}
}
}
struct TestPropertyWrapper_Previews: PreviewProvider {
static var previews: some View {
TestPropertyWrapper()
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1569 次 |
最近记录: |