我的UITableViewCells有步进。我从其他答案中看到,人们正在使用UIStepper.tag传递indexPath.row,但是我的UITableView中有一些部分,我需要将indexPath直接保存在类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。
怎么解决这个问题?
发布于 2019-12-02 03:47:51
我明白你想做什么。我不知道这是否是最好的解决方案,但问题是导致的,因为这个属性对于整个类是静态的,所以当您为任何行设置值时,您之前的内容就会被覆盖。
使用cellForRowAt加载第一个单元格时,可以将indexPath设置为0-0。对于第二行,将其设置为0-1,依此类推。最后一行将它设置为它在那一刻拥有的任何值,以及您之前所拥有的都会丢失。换句话说,该值对于所有实例都是共享的(它是一个类属性)。
您需要的是一个实例属性,因此每个对象对于该值都有自己的内存。您可以创建一个只向其定义添加一个UIStepper属性的indexPath子类,而不是使用它,而不是使用一个扩展。类似于:
class CellStepper: UIStepper {
var indexPath: IndexPath?
}然后,在cellForRowAt中将其设置为所需的值。
我认为您正在为每个步骤设置与valueChanged的目标相同的方法,当调用该方法时,可以使用发送方将其转换为CellStepper,并访问indexPath属性,以了解哪个行的步骤发生了更改。
如果您想要样例代码,我可以详细说明。
发布于 2019-12-02 18:16:40
您在extension UIStepper中试图做的事情是糟糕的。
免责声明:下面我提议的也是不好的,甚至更糟。如果可以的话,可以避免这种方法,并按照@George_Alegre的建议使用继承--这是最好和正确的方法。
但是..。如果由于一些非常奇怪的原因,您不能使用子类,则可以使您所做的操作。主要问题是在static中--它是在类的所有实例之间共享的,这就是为什么所有分步程序都具有最新的设置值的原因。因此,让我们将一个值替换为容器,它将保存对实例和期望值的引用。
重要:您必须在使用此工作流(例如,工作流)之后清除该容器。在管理此表的控制器的设计中
以下是方法:
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
}
}
}https://stackoverflow.com/questions/59033427
复制相似问题