我在swift编码方面相当新,我一直试图在过去几天找到解决问题的方法,但我无法做到。
我有一个名为userData
的类,具有各种属性:
class UserData {
var name: String
var age: Int
var credits: Int = 1
...
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
在viewController.swift中我声明了这个类的对象:
...
var user = UserData(name: "testing", age: 5)
...
在同一个viewController
里面我有一个UITableView
和几个UITableViewCells
。在每个细胞中都有一个UIStepper
使用来自单元格的UIStepper
我想增加或减少位于viewController.swift内的我的对象credits
的属性user
,并从tableViewCell.swift文件中执行此操作
从我能找到的,我认为我应该使用委托,但我可以弄清楚如何实现它。
更多信息:原谅艺术作品,我不是艺术家......
用户有一定数量的蚂蚁可以工作(这个数字是我的对象用户的属性)。还有一个属性,用于当前工作的蚂蚁数量(在我的屏幕截图中使用'蚂蚁')。
首先,顶部的白色标签显示为“0/5”(意味着用户有5个可用的蚂蚁可以工作,但目前没有一个工作)。
当用户增加“清道夫蚂蚁”的步进器时,顶部的白色标签应该说“1/5”(意味着当前有5个可用的蚂蚁工作)。
我想要做的是,当用户点击步进器时,“当前工作的蚂蚁”的用户属性会相应地递增或递减。
谢谢
在视图控制器的cellForRowAt
中设置该逻辑。
设置单元格时,每次UIStepper值更改时,您都可以在视图控制器中添加一个函数作为目标:
// inside cellForRowAtIndexPath:
cell.addTarget(self, action: #selector(doSomething(sender:), for: .valueChanged)
在doSomething
内部,您可以设置更新模型的逻辑。
func doSomething(sender: UIStepper) {
// do stuff here
}
使用委托模式的示例进行编辑,这将是未来读者的更好解决方案。
首先创建一个协议:
protocol StepperCellDelegate {
func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...)
func otherUsefulFunctions(...)
}
在您的单元格类中,为您的值更改时设置目标/操作:
// inside the cell's initialization (`init(style:reuseIdentifier:)`
self.addTarget(self, action: #selector(valueChanged(sender:), for: .valueChanged)
您的单元格还需要委托属性:
weak var stepperCellDelegate: StepperCellDelegate?
doSomething
看起来像这样:
func valueChanged(sender: UIStepper) {
stepperCellDelegate?.didChangeValueForStepper(inCell: self, ...)
}
您的ViewController将实现该协议
extension MyViewController: StepperCellDelegate {
func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...) {
// implementation here
}
func otherUsefulFunctions(...){
// implementation here
}
}
在cellForRowAtIndexPath
内部将自己定位为代表:
// inside cellForRowAtIndexPath:
cell.stepperCellDelegate = self
授权是处理此问题的正确方法。
UItableviewCell - 看起来都很相似 - 应该使用一组UIViewController可以实现的方法来公开协议。点击UIStepper小部件时会触发方法。
最好坚持这种方法,并在任何地方重复使用它。使事情易于管理松散耦合。