web-dev-qa-db-fra.com

NSIndexpath.item vs NSIndexpath.row

Est-ce que quelqu'un sait 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;
64
Cyberpass

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

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

En termes de style de programmation - et peut-être de chaîne de définition -, vous feriez mieux d'utiliser "ligne" dans le contexte des tableaux et "élément" dans le contexte des collections.

161
Owen Godfrey
indexPath.row is best in your case 

Première information sur NSIndexPath

La classe NSIndexPath représente le chemin d'accès à un nœud spécifique dans une arborescence de collections de tableaux imbriquées. Ce chemin est appelé chemin d'index.

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

Par exemple, la propriété indexPath 1.4.3.2 spécifie le chemin indiqué à la figure enter image description here

Ici, dans votre cas, indexPath.row renvoie l'index de la ligne à la variable indexPath.

Différences entreindexPath.row and indexPath.item

Généralement indexPath a deux propriétés

1 - rangée 

2 - item

Propriété row - à utiliser avec UITableView pour obtenir une base spécifique row sur indexPath. c'est aussi une propriété en lecture seule

 Available in iOS 2.0 and later.

item - utiliser correctement avec UICollectionView pour obtenir item dans la section . C'est une propriété en lecture seule. Pour utiliser cette propriété, vous devez la déclarer en
UICollectionView.h

>     Available in iOS 6.0 and later.
27
iPatel

Vous devez utiliser indexPath.row

La différence est que:

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 . (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 section d'une vue tabulaire . (lecture seule) @property(nonatomic, readonly) NSInteger row;

Discussion

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

Available in iOS 2.0 and later.

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

9
Midhun MP

La réponse de @Owen Godfrey est meilleure que la réponse acceptée de @iPatel. Voici quelques précisions supplémentaires que je ne pouvais pas insérer dans un commentaire sur sa réponse. Je vais donc copier sa réponse et la compléter ici. Le crédit appartient à Owen.


De @Owen Godfrey:

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

En termes de style de programmation - et peut-être de chaîne de définition -, vous feriez mieux d'utiliser "ligne" dans le contexte des tableaux et "élément" dans le contexte des collections.


L’interface principale de NSIndexPath est définie dans NSIndexPath.h. Le stockage des index est dans _indexes, qui est un tableau privé unidimensionnel de NSUInteger. NSIndexPath par lui-même peut représenter un nombre quelconque de dimensions. Il existe deux catégories pertinentes sur NSIndexPath qui étendent les fonctionnalités, une de UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" et une de UITableView.h "NSIndexPath (UITableView)". Celui de UICollectionView.h ajoute la propriété en lecture seule "item" et les méthodes pratiques associées. Celui de UITableView.h ajoute la propriété readonly "row" et les méthodes pratiques associées. Cependant, les deux propriétés ne sont que des wrappers qui accèdent à la valeur sous-jacente dans _indexes [1].

Etant donné que UIKit est lié aux deux catégories, les deux ensembles de fonctions pratiques sont toujours disponibles, où que vous soyez dans IOS. Donc, vous pouvez créer un NSIndexPath à partir de [NSIndexPath indexPathForRow: inSection:] mais récupérer le deuxième index à partir de indexPath.item. La valeur sous-jacente est exactement la même qu’elle soit accédée par indexPath.item ou indexPath.row.

Stylistiquement, cela est plus propre si vous utilisez "item" avec UICollectionView et "row" avec UITableView, car c'est ainsi qu'ils étaient censés être utilisés, ce qui rend le code plus lisible. Cependant, votre programme ne plantera pas si vous les échangez.

Référence: NSIndexPath

1
spencery2

Regardez au 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 au sein d'instances UICollectionView.

Au bas de UITableView.h, une section similaire ajoute les propriétés row et section pour NSIndexPaths utilisées dans UITableViews.

Si vous essayez d'accéder à ces propriétés d'une instance NSIndexPath au sein d'une classe et que le NSIndexPathInstance ne croit pas y être, importez simplement l'en-tête de la classe qui les définit dans le haut de votre classe et vous pourrez accéder comme par magie 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 celle désirée dans votre classe de la manière suivante:

@import "UIKit/UITableView.h"

Et puis vous pouvez faire des choses comme: myIndexPath.row et [myIndexPath row]

0
Alex Zavatone