如何从 TableViewCell 中访问 ViewController 中的对象
How to access an object inside a ViewController from within a TableViewCell
我对 swift 的编码还很陌生,过去几天我一直在努力寻找解决问题的方法,但没能成功。
我有一个名为 userData
的 class 具有各种属性:
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里面我声明了这个class的一个对象:
...
var user = UserData(name: "testing", age: 5)
...
里面同一个viewController
我有一个UITableView
和几个UITableViewCells
。在每个单元格中都有一个 UIStepper
使用单元格中的 UIStepper
我想增加或减少位于 [ 中的对象 user
的 属性 credits
viewController.swift,并从 tableViewCell.swift 文件
中执行此操作
据我所知,我认为我应该使用委托,但我知道如何实现它。
更多信息:
请原谅艺术作品,我不是艺术家...
用户有一定数量的蚂蚁可以工作(这个数字是我的对象用户的属性)。还有一个 属性 表示当前正在工作的蚂蚁数量(在我的屏幕截图中为 'ants used')。
起初,顶部的白色标签显示“0/5”(意味着用户有 5 个可用的蚂蚁可以工作,但 none 当前正在工作)。
当用户增加 'scavenger ants' 的步进器时,顶部的白色标签应显示“1/5”(表示当前可用的 5 只蚂蚁中有 1 只正在工作)。
我想做的是,当用户点击步进器时,用户 属性 的 'ants currently working' 会相应地递增或递减。
谢谢
在视图控制器中设置该逻辑 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(...)
}
在您的单元格 class 中,设置一个 target/action 用于更改值的时间:
// 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 小部件时触发。
最好坚持这种方法,并在任何地方重复使用它。使
事物可管理松耦合。
我对 swift 的编码还很陌生,过去几天我一直在努力寻找解决问题的方法,但没能成功。
我有一个名为 userData
的 class 具有各种属性:
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里面我声明了这个class的一个对象:
...
var user = UserData(name: "testing", age: 5)
...
里面同一个viewController
我有一个UITableView
和几个UITableViewCells
。在每个单元格中都有一个 UIStepper
使用单元格中的 UIStepper
我想增加或减少位于 [ 中的对象 user
的 属性 credits
viewController.swift,并从 tableViewCell.swift 文件
据我所知,我认为我应该使用委托,但我知道如何实现它。
更多信息: 请原谅艺术作品,我不是艺术家...
用户有一定数量的蚂蚁可以工作(这个数字是我的对象用户的属性)。还有一个 属性 表示当前正在工作的蚂蚁数量(在我的屏幕截图中为 'ants used')。
起初,顶部的白色标签显示“0/5”(意味着用户有 5 个可用的蚂蚁可以工作,但 none 当前正在工作)。
当用户增加 'scavenger ants' 的步进器时,顶部的白色标签应显示“1/5”(表示当前可用的 5 只蚂蚁中有 1 只正在工作)。
我想做的是,当用户点击步进器时,用户 属性 的 'ants currently working' 会相应地递增或递减。
谢谢
在视图控制器中设置该逻辑 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(...)
}
在您的单元格 class 中,设置一个 target/action 用于更改值的时间:
// 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 小部件时触发。
最好坚持这种方法,并在任何地方重复使用它。使 事物可管理松耦合。