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;
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.
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
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.
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
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
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]