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