2009-12-04 63 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