如何从TableViewCell内部访问ViewController内部的对象

时间:2019-03-23 13:45:33

标签: swift xcode uitableview object viewcontroller

我在快速编码方面还很陌生,在过去的几天里我一直在努力寻找解决问题的方法,但现在还没有。

我有一个名为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 文件

中执行此操作

据我所知,我认为我应该使用一个委托,但我可以弄清楚如何实现它。

更多信息: 请原谅艺术品,我不是艺术家...

my app image

用户有一定数量的可用于工作的蚂蚁(此数字是我的对象用户的属性)。还有一个关于当前正在工作的蚂蚁数量的属性(在我的屏幕截图中为“使用的蚂蚁”)。

首先,顶部的白色标签显示为“ 0/5”(表示用户有5个可用的蚂蚁在工作,但目前没有一个在工作)。

当用户增加“清除剂蚂蚁”的步进器时,顶部的白色标签应显示为“ 1/5”(表示当前有5种可用的蚂蚁在工作)。

我想做的是,当用户单击步进器时,“当前正在工作的蚂蚁”的用户属性会相应地递增或递减。

谢谢

2 个答案:

答案 0 :(得分:2)

在视图控制器的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

答案 1 :(得分:1)

委派是处理此问题的正确方法。

该UItableviewCell —两者看起来很相似–  应该使用一组方法公开协议  UIViewController可以实现的功能。方法是 当您点击UIStepper小部件时触发。

最好坚持这种方法,并在所有地方重复使用。使 容易处理的事物。