87 votes

NSIndexpath.item vs NSIndexpath.row

Quelqu'un connaît-il la différence entre NSIndexpath.row et NSIndexpath.item ?

Plus précisément, lequel dois-je utiliser dans :

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

212voto

Owen Godfrey Points 471

D'accord, personne n'a donné de bonne réponse ici.

Dans NSIndexPath, les index sont stockés dans un simple tableau c appelé "_indexes" défini comme NSUInteger* et la longueur du tableau est stockée dans "_length" défini comme NSUInteger. L'accesseur "section" est un alias de "_indexes[0]" et "item" et "row" sont des alias de "_indexes[1]". Les deux sont donc fonctionnellement identiques.

En termes de style de programmation - et peut-être de chaîne de définition - il est préférable d'utiliser "row" dans le contexte des tables et "item" dans le contexte des collections.

31voto

iPatel Points 15121
indexPath.row is best in your case 

Premières informations sur NSIndexPath

En NSIndexPath représente le chemin d'accès à un nœud spécifique dans un arbre de collections de tableaux imbriqués. Ce chemin est connu sous le nom de chemin d'index.

Chaque index d'un indexPath représente l'index d'un tableau d'enfants d'un nœud de l'arbre vers un autre nœud plus profond.

Par exemple , le chemin d'indexation 1.4.3.2 spécifie le chemin indiqué dans la figure enter image description here

Dans votre cas indexPath.row renvoie l'index de la ligne à l'emplacement spécifique indexPath .

Différences entre indexPath.row and indexPath.item

En général indexPath a deux propriétés

1 - rangée

2 - article

rangée - l'utilisation de la propriété avec UITableView pour obtenir des informations spécifiques rangée base sur indexPath il s'agit également d'une propriété en lecture seule

 Available in iOS 2.0 and later.

article - utiliser correctement avec UICollectionView pour obtenir article i Il s'agit d'une propriété en lecture seule. Pour utiliser cette propriété, vous devez la déclarer dans la section
UICollectionView.h

>     Available in iOS 6.0 and later.

10voto

Midhun MP Points 22312

Vous devez utiliser indexPath.row

La différence est la suivante :

indexPath.row est pour tableView et indexPath.item est pour collectionView .

article

Numéro d'index identifiant un élément dans une section d'une vue de collection. (en lecture seule) @property (nonatomic, readonly) NSInteger item;

Discussion

La section dans laquelle se trouve l'article est identifiée par la valeur de section. Disponibilité

Available in iOS 6.0 and later.

Déclaré dans UICollectionView.h


rangée

Numéro d'index identifiant une ligne dans une série (en lecture seule) @property(nonatomic, readonly) NSInteger row;

Discussion

La section dans laquelle se trouve la ligne est identifiée par le symbole Disponibilité

Available in iOS 2.0 and later.

Veuillez vérifier le NSIndexPath Additions pour plus de détails

4voto

spencery2 Points 456

La réponse de @Owen Godfrey est meilleure que la réponse acceptée de @iPatel. Voici quelques éclaircissements supplémentaires que je n'ai pas pu intégrer dans un commentaire sur sa réponse, je vais donc copier sa réponse et la compléter ici. Le crédit revient à Owen.


De @Owen Godfrey :

Dans NSIndexPath, les index sont stockés dans un simple tableau c appelé "_indexes" défini comme NSUInteger* et la longueur du tableau est stockée dans "_length" défini comme NSUInteger. L'accesseur "section" est un alias de "_indexes[0]" et "item" et "row" sont des alias de "_indexes". 1 ". Les deux sont donc fonctionnellement identiques.

En termes de style de programmation - et peut-être de chaîne de définition - il est préférable d'utiliser "row" dans le contexte des tables et "item" dans le contexte des collections.


L'interface de base de NSIndexPath est définie dans NSIndexPath.h. Le stockage des index se fait dans _indexes qui est un tableau privé unidimensionnel de NSUInteger. NSIndexPath en lui-même peut représenter n'importe quel nombre de dimensions. Il existe deux catégories pertinentes sur NSIndexPath qui étendent la fonctionnalité, l'une provenant de UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" et l'autre de UITableView.h "NSIndexPath (UITableView)". Celle de UICollectionView.h ajoute la propriété en lecture seule "item" et les méthodes de commodité correspondantes. Celle de UITableView.h ajoute la propriété readonly "row" et les méthodes de commodité associées. Cependant, les deux propriétés ne sont que des enveloppes qui accèdent à la valeur sous-jacente dans _indexes[1].

Comme UIKit est lié aux deux catégories, les deux ensembles de fonctions de commodité sont toujours disponibles, quel que soit l'endroit de l'IOS où vous les utilisez. Vous pouvez donc créer un NSIndexPath à partir de [NSIndexPath indexPathForRow:inSection :] mais récupérer le second index à partir de indexPath.item. La valeur sous-jacente est exactement la même que l'on accède par indexPath.item ou indexPath.row.

D'un point de vue stylistique, il est plus propre d'utiliser "item" avec UICollectionView et "row" avec UITableView, car c'est ainsi qu'ils ont été conçus, et cela rend le code plus lisible. Cependant, votre programme ne plantera pas si vous les intervertissez.

Référence : NSIndexPath

1voto

Alex Zavatone Points 901

Regardez en bas de UICollectionView.h et vous verrez la catégorie qui étend NSIndexPath pour ajouter item en tant que propriété lorsqu'elle est utilisée dans les instances UICollectionView.

Il existe une section similaire au bas de UITableView.h qui ajoute row et section pour les NSIndexPaths utilisés dans les UITableViews.

Si vous essayez d'accéder à ces propriétés d'une instance de NSIndexPath dans une classe et que l'instance de NSIndexPath ne croit pas qu'elles existent, importez simplement l'en-tête de la classe qui les définit dans le haut de votre classe et vous serez magiquement en mesure d'accéder à ces propriétés.

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

Pour utiliser ces propriétés dans votre classe, vous devez importer la propriété souhaitée dans votre classe comme suit :

@import "UIKit/UITableView.h"

Ensuite, vous pouvez faire des choses comme : myIndexPath.row et [myIndexPath row]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X