在我的ViewController
中,我正在设置多个所谓的PanelControl
。
这些PanelControl
使用标题,UISlider
和信息以及另一个UIView
称为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
设置。从字面上传递它
ViewToEdit.propertyToEdit
,但这显然也没有任何意义。我该怎么办?
最佳答案
如何使用关键路径:
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)
关于ios - 通过“部分关闭”的优雅方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49446744/