2

Is there a better way than what is proposed here to create a one-to-one mapping between an table view cell's NSIndexPath and a unique NSUInteger or int, in order to create a unique tag property value for a widget in the cell (a UIProgressView)?

The link adds methods through a UIKit category extension that converts between NSIndexPath and int, but they only work for less than a certain number of rows.

Granted, I may not run into that limit, but I'm wondering if there is a mapping that someone has come up with that can be guaranteed to work for any number of rows.

4

2 回答 2

2

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

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

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

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

于 2009-12-05T03:26:18.813 回答
0

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

另外,它在计算上更便宜。

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

于 2009-12-06T00:08:31.037 回答