在我的ViewController
中,我正在设置多个所谓的PanelControl
。
这些PanelControl
初始化时带有标题UISlider
和信息,另一个名为UIView
的{{1}}的属性要更改为该滑块(ViewToEdit
有参考它)。
它始终是ControlPanel
或CGFloat
类型的单个属性。
我希望在初始化UIColor
时能够传递ViewToEdit
的属性(非值)。
所以我想这样用它:
PanelControl
PanelControl(title: "doesnt matter", propertyToEdit: ViewToEdit.propertyToEdit)
会像这样实现它:
PanelControl
请注意,上面的代码只是我的幻想而且实际上并不起作用。它只是说明了我想要的用法。
通过这种方式,我可以创建class PanelControl: UIView {
...
func sliderChanged(slider: UISlider) {
propertyToEdit = slider.value
}
}
的许多实例,并传递关于它们控制的PanelControl
属性的每个不同信息。
使用闭包,但这不合适,因为它不是我要传递的完整声明。而是声明的部分。所以ViewToEdit
在执行时viewToEdit.propertyToEdit = ...
设置了该语句的右侧。
直接传递它PanelControl
,但这显然没有任何意义。
我该怎么办?
答案 0 :(得分:0)
如何使用关键路径:
class PanelControl: UIView {
let changer: (Float) -> Void
init<T: AnyObject>(title: String, object: T, property: ReferenceWritableKeyPath<T, Float>) {
changer = { object[keyPath: property] = $0 }
}
func sliderChanged(slider: UISlider) {
changer(slider.value)
}
}
你可以像这样使用它:
PanelControl(title: "doesnt matter", object: myViewModel, property: \ViewToEdit.propertyToEdit)