Conversione tra NSIndexPath unico e NSUInteger unico (o int)
-
13-09-2019 - |
Domanda
C'è un modo migliore di quello che è qui proposto per creare un mapping uno-a-uno tra NSIndexPath
di una cella di vista tabella e un NSUInteger
unico o int
, al fine di creare un valore di proprietà tag
univoco per un widget nella cella (un UIProgressView
)?
Il collegamento aggiunge metodi attraverso una categoria di estensione UIKit
che converte tra NSIndexPath
e int
, ma funzionano solo per meno di un certo numero di righe.
Certo, non posso correre in quel limite, ma mi chiedo se c'è una mappatura che qualcuno ha messo a punto che può essere garantito per funzionare per qualsiasi numero di righe.
Soluzione
No, in realtà non c'è un modo che è garantito per funzionare per qualsiasi numero di righe. Se si dispone di un tavolo con 2 sezioni, ciascuna con 3 miliardi di righe, quindi non c'è modo di mappare i 6 miliardi di potenziali NSIndexPaths nelle 4 miliardi NSIntegers a 32 bit.
(se si stesse costruendo un 64-bit app, la stessa cosa che è vero, ma i numeri avrebbe dovuto essere un altro 4 miliardi di volte più grande nell'esempio.)
Essi utilizzano un limite di 10.000 righe per sezione nell'esempio si è collegato al; se siete seriamente preoccupato si potrebbe avere più righe di questo, si potrebbe usare una costante più grande, vale a dire si potrebbe usare 1.000.000 il numero massimo di righe se sai che non avrà più di 4.000 sezioni.
Si noti che un "vero e proprio programmatore" presumibilmente utilizzare 65536 come la costante, ovviamente.
Altri suggerimenti
Se avevo bisogno di fare questo avrei semplicemente spostare il percorso sezione a metà di un 32-bit int, e spostare la parte fila all'altro. Sì, questo significa che non si può avere più di 65535 elementi di fila (in rottura fuori ho assunto unsigned int poiché fila / sezione sarà mai essere negativo), ma mi prendo un limite assunto molto più grande di quanto io sia mai bisogno, nel corso una magia costante in qualsiasi giorno.
In più è computazionalmente più conveniente.
Di solito in questa situazione se ho impostato il mio controller di vista tabella come un delegato per ogni cella, e la cellula in grado di richiamare il controller con le eventuali modifiche insieme a qualche valore chiave utilizzata per creare la cellula - dopo tutto, quando si popolano una cella si sa come raggiungere nel set di dati per estrarre i valori. Heck, si potrebbe anche semplicemente memorizzare l'IndexPath nella cella ed è possibile richiamare con quello. Il motivo per cui non vorrei usare l'approccio IndexPath o la prima che coinvolge uno appiattimento NSIndexPath in un tag è che se mai iniziare a cambiare le righe in modo dinamico i valori potrebbero diventare non allineato tra la NSndexPath si è creato una cella con e il valore per il set di dati corrente. Molto meglio avere un qualche tipo di chiave che sarà sempre farti tornare ai dati giusti logico.