在唯一的NSIndexPath和唯一的NSUInteger(或int)之间进行转换

时间:2009-12-04 21:11:51

标签: iphone uikit tags uiprogressview nsindexpath

是否有比proposed here更好的方法在表格视图单元格的NSIndexPath和唯一的NSUIntegerint之间创建一对一的映射,为单元格中的窗口小部件创建唯一的tag属性值(UIProgressView)?

该链接通过UIKit类别扩展程序添加方法,该扩展程序可在NSIndexPathint之间进行转换,但它们仅适用于少于一定数量的行。

当然,我可能不会遇到这个限制,但我想知道是否有人提出的映射可以保证适用于任意数量的行。

2 个答案:

答案 0 :(得分:2)

不,确实没有一种方法可以保证适用于任意数量的行。如果你有一个包含2个部分的表,每个部分有30亿行,那么就没有办法将这60亿个潜在的NSIndexPaths映射到40亿个32位NSIntegers中。

(如果您正在构建一个64位应用程序,同样的事情也是如此,但在该示例中,数字必须再大40亿倍。)

在您链接的示例中,他们使用每个部分限制10,000行;如果你真的担心你可能有更多的行,你可以使用一个更大的常数,即如果你知道你不会有超过4,000个部分,你可以使用1,000,000作为最大行数。

请注意,“真正的程序员”可能会使用65536作为常量。

答案 1 :(得分:0)

如果我需要这样做,我只需将节路径移动到32位int的一半,然后将行部分移到另一半。是的,这意味着你不能连续超过65535个元素(在破坏时我假设无符号整数,因为行/节永远不会是负数)但是我将采取一个远大于我所需要的假设限制,任何一天都是一个神奇的常数。

另外它的计算成本更低。

通常在这种情况下我将表视图控制器设置为每个单元格的委托,并且单元格可以使用任何更改回调控制器以及用于创建单元格的一些键值 - 毕竟当您填充时您知道如何进入数据集以提取值的单元格。哎呀,你甚至可以简单地将IndexPath存储到单元格中,它可以回调它。我不使用IndexPath方法或将NSIndexPath扁平化为标记的先前方法的原因是,如果您开始动态更改行,则值可能会在您创建单元格的NSndexPath与当前数据集的值之间不对齐。更好的方法是拥有一种能够让你在逻辑上恢复正确数据的密钥。