【发布时间】:2021-05-07 16:12:28
【问题描述】:
我想通过 onReceive 订阅 SwiftUI 中的 UIPasteboard 更改。
pHasStringsPublisher 不会在剪贴板中的某些内容发生更改时立即更新,我不明白为什么。
import SwiftUI
struct ContentView: View {
let pasteboard = UIPasteboard.general
@State var pString: String = "pString"
@State var pHasStrings: Bool = false
@State var pHasStringsPublisher: Bool = false
var body: some View {
VStack{
Spacer()
Text("b: '\(self.pString)'")
.font(.headline)
Text("b: '\(self.pHasStrings.description)'")
.font(.headline)
Text("p: '\(self.pHasStringsPublisher.description)'")
.font(.headline)
Spacer()
Button(action: {
self.pString = self.pasteboard.string ?? "nil"
self.pHasStrings = self.pasteboard.hasStrings
}, label: {
Text("read pb")
.font(.largeTitle)
})
Button(action: {
self.pasteboard.items = []
}, label: {
Text("clear pb")
.font(.largeTitle)
})
Button(action: {
self.pasteboard.string = Date().description
}, label: {
Text("set pb")
.font(.largeTitle)
})
}
.onReceive(self.pasteboard
.publisher(for: \.hasStrings)
.print()
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
, perform:
{ hasStrings in
print("pasteboard publisher")
self.pHasStringsPublisher = hasStrings
})
}
}
【问题讨论】:
-
您确定
hasStrings是符合 KVO 的属性吗?publisher(for: KeyPath方法仅适用于符合 KVO 的属性,因为它在底层使用了 KVO。该属性的文档没有提到它符合 KVO,所以我怀疑它实际上不是。您需要找到另一种方法来观察粘贴板的变化。 -
感谢您的澄清。我不知道符合 KVO 的属性,但我会记住这一点。
标签: swift swiftui combine uipasteboard