首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UIStepper类中存储值

在UIStepper类中存储值
EN

Stack Overflow用户
提问于 2019-11-25 13:51:50
回答 2查看 87关注 0票数 3

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

代码语言:javascript
复制
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。

怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-02 03:47:51

我明白你想做什么。我不知道这是否是最好的解决方案,但问题是导致的,因为这个属性对于整个类是静态的,所以当您为任何行设置值时,您之前的内容就会被覆盖。

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

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

代码语言:javascript
复制
class CellStepper: UIStepper {
    var indexPath: IndexPath?
}

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

我认为您正在为每个步骤设置与valueChanged的目标相同的方法,当调用该方法时,可以使用发送方将其转换为CellStepper,并访问indexPath属性,以了解哪个行的步骤发生了更改。

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

票数 2
EN

Stack Overflow用户

发布于 2019-12-02 18:16:40

您在extension UIStepper中试图做的事情是糟糕的。

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

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

重要:您必须在使用此工作流(例如,工作流)之后清除该容器。在管理此表的控制器的设计中

以下是方法:

代码语言:javascript
复制
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
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59033427

复制
相关文章

相似问题

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