在 UIStepper 中存储值 class

Store value in UIStepper class

我的 UITableViewCells 中有步进器。 我从其他答案中看到人们正在使用 UIStepper.tag 来传递 indexPath.row ,但是我的 UITableView 中有部分,我需要将 indexPath 直接保存在 class UIStepper.

extension UIStepper {

    struct Save {
        static var indexPath:IndexPath?
    }

    public var indexPath:IndexPath {
        get{
            return Save.indexPath!
        }
        set(newValue) {
            Save.indexPath = newValue
        }
    }
}

我正在使用此代码来存储 indexPath。在我的 cellForRow 我设置 stepper.indexPath = indexPath,但我的 UIStepper 的 indexPath 始终是最后一个。

每个 UIStepper 都有最后一个 indexPath。

如果我有 4 行,输出 UIStepper。indexPath.row 对于所有单元格总是 3。

如何解决?

我明白你想做什么。我不知道这是否是最好的解决方案,但你遇到的问题是因为 属性 对于整个 class 是静态的,所以当你为任何行设置值时,你所拥有的在被覆盖之前。

当您使用 cellForRowAt 加载第一个单元格时,您将 indexPath 设置为 0-0。对于第二行,您将其设置为 0-1,依此类推。最后一行将其设置为当时的任何值,而您之前拥有的任何值都会丢失。 换句话说,该值为所有实例共享(它是 class 属性)。

您需要的是一个实例 属性,因此每个对象都有自己的内存来存储该值。您可以创建一个仅向其定义添加 indexPath 属性 的 UIStepper subclass 来代替使用扩展,而不是使用扩展。类似于:

class CellStepper: UIStepper {
    var indexPath: IndexPath?
}

然后,在cellForRowAt中将其设置为您需要的值。

我想你正在为每个步进器设置与 valueChanged 目标相同的方法,当它被调用时,你可以使用发件人将其转换为 CellStepper 并访问 indexPath 属性 了解更改了哪一行的步进器。

如果你想要示例代码,我可以详细说明。

您在 extension UIStepper 中尝试做的事情很糟糕。

免责声明:我在下面提出的建议也很糟糕,甚至更糟。如果可以,请避免这种方法并使用@George_Alegre 提出的继承 - 这是最好和正确的方法。

但是...如果由于某些非常非常奇怪的原因您不能使用 subclassing,则有可能使您所做的操作可操作。主要问题在 static - 它在 class 的所有实例之间共享,这就是为什么您的所有步进器都具有最新的设置值。因此,让我们用容器替换一个值,该容器将保存对实例和所需值的引用对。

重要提示:使用此工作流程后,您必须清洁该容器 例如。在管理此 table

的控制器的初始化中

方法如下:

extension UIStepper {

    struct Save {
        static var indexPaths = [UIStepper: IndexPath]()

        // !!! MUST BE CALLED AT THE END OF USAGE (eg. in controller deinit)
        static func cleanup() {
            indexPaths = [:]
        }
    }

    public var indexPath: IndexPath {
        get {
            return Save.indexPaths[self] ?? IndexPath()
        }
        set(newValue) {
            Save.indexPaths[self] = newValue
        }
    }
}