NSIndexpath.item frente a NSIndexpath.row

82

¿Alguien sabe la diferencia entre NSIndexpath.rowy NSIndexpath.item?

Específicamente, cuál uso en:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Cyberpass
fuente
2
sí, rowse usa por UITableViewfilas; lo itemutilizan las UICollectionViewcélulas.
holex

Respuestas:

204

De acuerdo, nadie ha dado una buena respuesta aquí.

Dentro de NSIndexPath, los índices se almacenan en una matriz c simple llamada "_indexes" definida como NSUInteger * y la longitud de la matriz se almacena en "_length" definida como NSUInteger. La "sección" del descriptor de acceso es un alias de "_indexes [0]" y tanto el "elemento" como la "fila" son alias de "_indexes [1]". Por tanto, los dos son funcionalmente idénticos.

En términos de estilo de programación, y quizás la cadena de definición, sería mejor usar "fila" en el contexto de tablas y "elemento" en el contexto de colecciones.

Owen Godfrey
fuente
28
indexPath.row is best in your case 

Primera información sobre NSIndexPath

La NSIndexPathclase representa la ruta a un nodo específico en un árbol de colecciones de matrices anidadas. Esta ruta se conoce como ruta de índice.

Cada índice en un indexPath representa el índice en una matriz de elementos secundarios de un nodo en el árbol a otro nodo más profundo.

Por ejemplo , indexPath 1.4.3.2 especifica la ruta que se muestra en la Figura ingrese la descripción de la imagen aquí

Aquí, en su caso, indexPath.rowdevuelve el índice de la fila en el específico indexPath.

Diferencias entre indexPath.row and indexPath.item

Generalmente indexPathtiene dos propiedades

1 - fila

2 - artículo

fila: uso de la propiedad con UITableViewpara obtener una base de fila específica en indexPath. también es propiedad de solo lectura

 Available in iOS 2.0 and later.

item: se usa correctamente con UICollectionViewpara obtener el elemento en la sección Es una propiedad de solo lectura. Para utilizar esta propiedad, debe declararla en
UICollectionView.h

>     Available in iOS 6.0 and later.
iPatel
fuente
Podrías haber dado el enlace de referencia de clase NSIndexPath, ¿sabes?
esh
25
Quizás, pero generalmente se recomienda incluir partes relevantes en la propia respuesta. Dado que las otras respuestas dieron una respuesta demasiado estrecha, agradezco a alguien que señala el uso más amplio de NSIndexPath.
Rob
6
Todavía no veo ninguna mención de indexPath.item, mientras que una de las cosas que preguntaba era la diferencia entre indexPath.item e indexPath.row. La respuesta de Midhun MP hace eso. Simplemente copiar y pegar documentación no ayuda mucho sin cierta cantidad de elaboración.
esh
10

Necesitas usar indexPath.row

La diferencia es que:

indexPath.row es para tableView e indexPath.item es para collectionView .

articulo

Un número de índice que identifica un artículo en una sección de una vista de colección. (solo lectura)@property (nonatomic, readonly) NSInteger item;

Discusión

La sección en la que se encuentra el artículo se identifica mediante el valor de sección. Disponibilidad

Available in iOS 6.0 and later.

Declarado en UICollectionView.h


fila

Un número de índice que identifica una fila en una sección de una vista de tabla. (solo lectura)@property(nonatomic, readonly) NSInteger row;

Discusión

La sección en la que se encuentra la fila se identifica mediante el valor de sección. Disponibilidad

Available in iOS 2.0 and later.

Consulte las adiciones de NSIndexPath para obtener más detalles.

MP Midhun
fuente
4

La respuesta de @Owen Godfrey es mejor que la respuesta aceptada de @iPatel. Aquí hay una aclaración adicional que no pude incluir en un comentario sobre su respuesta, así que copiaré su respuesta y la agregaré aquí. El crédito pertenece a Owen.


De @Owen Godfrey:

Dentro de NSIndexPath, los índices se almacenan en una matriz c simple llamada "_indexes" definida como NSUInteger * y la longitud de la matriz se almacena en "_length" definida como NSUInteger. El descriptor de acceso "sección" es un alias de "_indexes [0]" y tanto "elemento" como "fila" son alias de "_indexes 1 ". Por tanto, los dos son funcionalmente idénticos.

En términos de estilo de programación, y quizás la cadena de definición, sería mejor usar "fila" en el contexto de tablas y "elemento" en el contexto de colecciones.


La interfaz principal de NSIndexPath se define en NSIndexPath.h. El almacenamiento de los índices está en _indexes, que es una matriz unidimensional privada de NSUInteger. NSIndexPath por sí mismo puede representar cualquier número de dimensiones. Hay dos categorías relevantes en NSIndexPath que amplían la funcionalidad, una de UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" y otra de UITableView.h "NSIndexPath (UITableView)". El de UICollectionView.h agrega la propiedad de solo lectura "item" y los métodos de conveniencia relacionados. El de UITableView.h agrega la propiedad de solo lectura "fila" y métodos de conveniencia relacionados. Sin embargo, ambas propiedades son simplemente contenedores que acceden al valor subyacente en _indexes [1].

Dado que UIKit se vincula con ambas categorías, ambos conjuntos de funciones de conveniencia están siempre disponibles, sin importar en qué lugar del IOS las esté utilizando. Por lo tanto, podría crear un NSIndexPath desde [NSIndexPath indexPathForRow: inSection:] pero recuperar el segundo índice de indexPath.item. El valor subyacente es exactamente el mismo si se accede por indexPath.item o indexPath.row.

Estilísticamente, es más limpio si usa "item" con UICollectionView y "row" con UITableView, ya que así es como estaban destinados a usarse, y esto hace que el código sea más legible. Sin embargo, su programa no se bloqueará si los intercambia.

Referencia: NSIndexPath

spencery2
fuente
0

Mire en la parte inferior de UICollectionView.hy verá la categoría que extiende NSIndexPath para agregar itemcomo una propiedad cuando se usa dentro de las instancias de UICollectionView.

Hay una sección similar en la parte inferior de UITableView.h que añade rowy sectionpropiedades para NSIndexPaths que se utilizan en UITableViews.

Si está intentando acceder a estas propiedades de una instancia de NSIndexPath dentro de una clase y NSIndexPathInstance no cree que estén allí, simplemente importe el encabezado de la clase que las define en la parte superior de su clase y mágicamente podrá acceder estas propiedades.

UICollectionView.h

@interface NSIndexPath (UICollectionViewAdditions)

+ (instancetype)indexPathForItem:(NSInteger)item inSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);

@property (nonatomic, readonly) NSInteger item NS_AVAILABLE_IOS(6_0);

@end

UITableView.h

//_______________________________________________________________________________________________________________

// This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
@interface NSIndexPath (UITableView)

+ (instancetype)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;

@property (nonatomic, readonly) NSInteger section;
@property (nonatomic, readonly) NSInteger row;

@end

Para usar estas propiedades dentro de su clase, tendrá que importar la deseada a su clase así:

@import "UIKit/UITableView.h"

Y luego puedes hacer cosas como: myIndexPath.rowy[myIndexPath row]

Alex Zavatone
fuente