如何从UITableViewCell中访问View Controller中的对象

问题描述 投票:1回答:2

我在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文件中执行此操作

从我能找到的,我认为我应该使用委托,但我可以弄清楚如何实现它。

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

my app image

用户有一定数量的蚂蚁可以工作(这个数字是我的对象用户的属性)。还有一个属性,用于当前工作的蚂蚁数量(在我的屏幕截图中使用'蚂蚁')。

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

当用户增加“清道夫蚂蚁”的步进器时,顶部的白色标签应该说“1/5”(意味着当前有5个可用的蚂蚁工作)。

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

谢谢

swift xcode uitableview object viewcontroller
2个回答
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
投票

授权是处理此问题的正确方法。

UItableviewCell - 看起来都很相似 - 应该使用一组UIViewController可以实现的方法来公开协议。点击UIStepper小部件时会触发方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.