10

在 SwiftUI 中,您可以直接使用 a 的实例Publisher作为@ObjectBinding属性,还是必须将其包装在实现的类中BindableObject

let subject = PassthroughSubject<Void, Never>()
let view = ContentView(data:subject)

struct ContentView : View {
  @ObjectBinding var data:AnyPublisher<Void, Never>
}

// When I want to refresh the view, I can just call: 
subject.send(())

这不会为我编译,只会挂起 Xcode 11 Beta 2。但你甚至应该被允许这样做吗?

4

2 回答 2

28

在您的视图正文中,使用.onReceive以下示例传递发布者,取自Data Flow Through SwiftUI - WWDC 2019 @ 21:23。在闭包内部,您更新了一个@State var,而该变量又在主体中的其他位置被引用,这会导致主体在更改时被调用。

在此处输入图像描述

于 2020-01-11T23:25:24.850 回答
5

您可以实现一个BindableObject将发布者作为初始值设定项参数的方法。

Publisher使用方便的函数进行扩展来创建 this BindableObject

class BindableObjectPublisher<PublisherType: Publisher>: BindableObject where PublisherType.Failure == Never {

    typealias Data = PublisherType.Output

    var didChange: PublisherType
    var data: Data?

    init(didChange: PublisherType) {
        self.didChange = didChange
        _ = didChange.sink { (value) in
            self.data = value
        }
    }
}

extension Publisher where Failure == Never {
    func bindableObject() -> BindableObjectPublisher<Self> {
        return BindableObjectPublisher(didChange: self)
    }
}

struct ContentView : View {
    @ObjectBinding var binding = Publishers.Just("test").bindableObject()

    var body: some View {
        Text(binding.data ?? "Empty")
    }
}
于 2019-06-23T01:45:16.037 回答