首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ViewController中访问TableViewCell中的对象

如何从ViewController中访问TableViewCell中的对象
EN

Stack Overflow用户
提问于 2019-03-23 13:45:32
回答 2查看 79关注 0票数 1

我在快速编码方面很新,在过去的几天里,我一直在试图找到解决我的问题的方法,但我无法这样做。

我有一个名为userData的类,它具有各种属性:

代码语言:javascript
复制
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中,我声明了这个类的一个对象:

代码语言:javascript
复制
...
var user = UserData(name: "testing", age: 5)
...

在同一个viewController中,我有一个带有几个UITableViewCellsUITableView。在每个单元中都有一个UIStepper

使用单元格中的viewController.swift,,我希望增加或减少位于tableViewCell.swift文件中的对象user的属性credits,并从tableViewCell.swift文件中执行这一操作。

根据我所能找到的,我认为我应该使用一个委托,但我可以知道如何实现它。

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

用户有一组可供工作的蚂蚁(此数字是我的对象用户的属性)。也有一个属性的蚂蚁数量,目前工作(‘蚂蚁使用’在我的屏幕截图)。

起初,顶部的白色标签上写着'0/5‘(这意味着用户有5个可用的蚂蚁可以工作,但目前没有一个可以工作)。

当用户增加“清除蚂蚁”的步数时,顶部的白色标签应该是'1/5‘(这意味着当前有1只蚂蚁在5只蚂蚁中工作)。

我想要做的是,当用户单击一个步骤时,“当前工作”的用户属性将适当地递增或减少。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-23 14:18:55

在视图控制器的cellForRowAt中设置该逻辑。

在设置单元格时,您可以在视图控制器中添加一个函数,作为每次UIStepper值更改的目标:

代码语言:javascript
复制
// inside cellForRowAtIndexPath:
cell.addTarget(self, action: #selector(doSomething(sender:), for: .valueChanged)

doSomething中,您设置了更新模型的逻辑。

代码语言:javascript
复制
func doSomething(sender: UIStepper) {
    // do stuff here
}

使用委托模式的示例进行编辑,这对于以后的读者来说是一个更好的解决方案。

首先创建一个协议:

代码语言:javascript
复制
protocol StepperCellDelegate {
    func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...)
    func otherUsefulFunctions(...)
}

在单元格类中,为值更改时设置目标/操作:

代码语言:javascript
复制
// inside the cell's initialization (`init(style:reuseIdentifier:)`
self.addTarget(self, action: #selector(valueChanged(sender:), for: .valueChanged)

您的单元格还需要一个委托属性:

代码语言:javascript
复制
weak var stepperCellDelegate: StepperCellDelegate?

doSomething应该是这样的:

代码语言:javascript
复制
func valueChanged(sender: UIStepper) {
    stepperCellDelegate?.didChangeValueForStepper(inCell: self, ...)
}

您的ViewController将实现该协议

代码语言:javascript
复制
extension MyViewController: StepperCellDelegate {
    func didChangeValueForStepper(inCell: Cell, whateverInfoYouWantHere:...) {
        // implementation here
    }

    func otherUsefulFunctions(...){
        // implementation here
    }
}

cellForRowAtIndexPath内部,将自己设置为委托:

代码语言:javascript
复制
// inside cellForRowAtIndexPath:
cell.stepperCellDelegate = self
票数 2
EN

Stack Overflow用户

发布于 2019-03-23 16:45:15

授权是处理这一问题的适当方式。

这个UItableviewCell --两者看起来都是相似的--应该公开一个协议,其中包含一组UIViewController可以实现的方法。方法在点击UIStepper小部件时触发。

最好坚持这种方法,并在任何地方重用它。使事情易于管理,松散耦合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55314351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档