如何从 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 的 属性 creditsviewController.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 小部件时触发。

最好坚持这种方法,并在任何地方重复使用它。使 事物可管理松耦合。