我是SwiftUI的新手。仅仅几天尝试学习。 我试图找到有关此的教程,但没有成功。
想象一下我有以下观点:
Struct MyPicker: View {
MyPicker
在VStack
内部的ContentView
内部。
我必须将三个参数从MyPicker
传递到ContentView
:color
,width
和type
。
问题在于这些值来自MyPicker
内部的委托回调。所以我必须在MyPicker
内部有一位协调员。
struct MyPickerHelper: UIViewRepresentable {
class Coordinator:NSObject, MyPickerDelegate {
var color:UIColor
var width:CGFloat
var type:PKInkingTool.InkType
func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
if toolPicker.selectedTool is PKInkingTool {
let tool = toolPicker.selectedTool as! PKInkingTool
self.color = tool.color
self.width = tool.width
self.type = tool.inkType
}
}
那里有很多东西,例如@Binding
,@Published
,@State
等。我该在哪里放置MyPicker来传达对ContentView
的更改?
答案 0 :(得分:2)
您需要在父视图中将状态作为真理的来源,并将对它的绑定传递到可表示的视图中,这是一个参数的示例...
struct MyPicker: View {
@State private var color: UIColor = .clear // << source
var body: some View {
MyPickerHelper(color: $color) // << pass binding
}
}
现在可以表示
struct MyPickerHelper: UIViewRepresentable {
@Binding var color: UIColor
func makeCoordinator() -> Coordinator {
Coordinator(owner: self)
}
...
class Coordinator:NSObject, MyPickerDelegate {
private var owner: MyPickerHelper
init(owner: MyPickerHelper) {
self.owner = owner
}
func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
if toolPicker.selectedTool is PKInkingTool {
let tool = toolPicker.selectedTool as! PKInkingTool
self.owner.color = tool.color // << here update via binding !!!
}
}
...
}