2009-12-04 67 views
2

有之间的转换比是proposed here一个更好的方式来创造之间的一个一对一映射的表视图单元格的NSIndexPath和独特的NSUIntegerint,以创建单元格中的小部件的唯一tag属性值(a UIProgressView)?独特NSIndexPath和独特NSUInteger(或INT)

该链接通过在NSIndexPathint之间转换的UIKit类别扩展添加了方法,但它们仅适用于少于特定数量的行。当然,我可能不会遇到这个限制,但是我想知道是否有人提出的映射可以保证适用于任意数量的行。

回答

2

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

(如果你正在建设一个64位的应用程序,同样的事情是真实的,但数字必须是在例如更大的另外4十亿倍。)

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

请注意,一个“真正的程序员”当然会推测使用65536作为常量。

+0

我知道我可以使用更大的常数。只是想知道是否有一种通用的方式来做到这一点,而不必玩常量。也许我应该向Apple提交功能请求... – 2009-12-05 03:37:15

+0

不,这里只是逻辑上不能将任何可能的NSIndexPath映射到NSInteger,因为NSIndexPath中有两个* NSInteger。除非您认为行/段足够小以便放入16位字段,否则您不能将64位可能的信息放入32位框。 – 2009-12-05 05:21:57

0

如果我需要这样做,我只需将节路径移动到32位int的一半,并将行部分移到另一部分。是的,这意味着连续不得超过65535个元素(在分解时我假设无符号整数,因为行/节将永远不会为负),但是我会假设一个远远超过我将需要的限制,超过一个魔术常数,任何一天。

加上它在计算上更便宜。

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

+0

“有更好的方法来获得某种能够让你在逻辑上恢复正确数据的密钥。”不幸的是,Apple似乎只提供了标签值以返回到一个小部件,所以我需要一些方法将获取的结果控制器项目转换为标签值,以便我可以更新单元格的进度视图。 – 2009-12-06 03:02:46

+0

为什么不使用cellForRowAtIndexPath:获取所需的单元格,并告诉它更新其进度条?标签可以作为一种捷径,但它们绝不是唯一的途径。 – 2009-12-06 03:41:40