NSIndexpath.item vs NSIndexpath.row


81

Kennt jemand den Unterschied zwischen NSIndexpath.rowund NSIndexpath.item?

In welchem ​​Fall verwende ich speziell:

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

2
ja, das rowwird von UITableViewZeilen verwendet; Das itemwird von UICollectionViewZellen verwendet.
Holex

Antworten:


203

Okay, hier hat niemand eine gute Antwort gegeben.

In NSIndexPath werden die Indizes in einem einfachen c-Array namens "_indexes" gespeichert, das als NSUInteger * definiert ist, und die Länge des Arrays wird in "_length" gespeichert, das als NSUInteger definiert ist. Der Accessor "section" ist ein Alias ​​für "_indexes [0]" und sowohl "item" als auch "row" sind Aliase für "_indexes [1]". Somit sind die beiden funktional identisch.

In Bezug auf den Programmierstil - und möglicherweise die Definitionskette - sollten Sie "Zeile" im Kontext von Tabellen und "Element" im Kontext von Sammlungen verwenden.


28
indexPath.row is best in your case 

Erste Infos zu NSIndexPath

Die NSIndexPathKlasse repräsentiert den Pfad zu einem bestimmten Knoten in einem Baum verschachtelter Array-Sammlungen. Dieser Pfad wird als Indexpfad bezeichnet.

Jeder Index in einem indexPath repräsentiert den Index in ein Array von untergeordneten Knoten von einem Knoten im Baum zu einem anderen, tieferen Knoten.

Beispielsweise gibt der indexPath 1.4.3.2 den in Abbildung gezeigten Pfad an Geben Sie hier die Bildbeschreibung ein

Hier in Ihrem Fall wird indexPath.rowder Index der Zeile an der spezifischen zurückgegeben indexPath.

Unterschiede zwischen indexPath.row and indexPath.item

Hat indexPathim Allgemeinen zwei Eigenschaften

1 Reihe

2 - Artikel

row - Eigenschaft, die mit verwendet wird, UITableViewum eine bestimmte Zeilenbasis auf indexPath abzurufen. Es ist auch eine schreibgeschützte Eigenschaft

 Available in iOS 2.0 and later.

item - richtig verwenden, UICollectionViewum den Artikel im Abschnitt abzurufen . Es ist eine schreibgeschützte Eigenschaft. Um diese Eigenschaft zu verwenden, müssen Sie sie in
UICollectionView.h deklarieren

>     Available in iOS 6.0 and later.

Sie hätten einfach den Link NSIndexPath-Klassenreferenz angeben können, wissen Sie?
Esh

23
Vielleicht, aber es wird allgemein empfohlen, relevante Teile in die Antwort selbst aufzunehmen. Angesichts der Tatsache, dass die anderen Antworten zu eng gefasst waren, schätze ich jemanden, der auf die breitere Verwendung von hinweist NSIndexPath.
Rob

6
Ich sehe immer noch keine Erwähnung von indexPath.item, während eines der Dinge, die die Frage stellte, der Unterschied zwischen indexPath.item und indexPath.row war. Die Antwort von Midhun MP macht das. Nur das Einfügen von Dokumentationen zu kopieren, hilft ohne viel Aufwand nicht viel.
Esh

10

Sie müssen verwenden indexPath.row

Der Unterschied ist, dass:

indexPath.row ist für tableView und indexPath.item ist für collectionView .

Artikel

Eine Indexnummer, die ein Element in einem Abschnitt einer Sammlungsansicht identifiziert. (schreibgeschützt)@property (nonatomic, readonly) NSInteger item;

Diskussion

Der Abschnitt, in dem sich das Element befindet, wird durch den Wert des Abschnitts identifiziert. Verfügbarkeit

Available in iOS 6.0 and later.

In UICollectionView.h deklariert


Reihe

Eine Indexnummer, die eine Zeile in einem Abschnitt einer Tabellenansicht identifiziert. (schreibgeschützt)@property(nonatomic, readonly) NSInteger row;

Diskussion

Der Abschnitt, in dem sich die Zeile befindet, wird durch den Wert des Abschnitts identifiziert. Verfügbarkeit

Available in iOS 2.0 and later.

Bitte überprüfen Sie die NSIndexPath-Ergänzungen für Details


4

Die Antwort von @Owen Godfrey ist besser als die akzeptierte Antwort von @iPatel. Hier ist eine weitere Klarstellung, die ich nicht in einen Kommentar zu seiner Antwort einfügen konnte. Deshalb werde ich seine Antwort kopieren und hier ergänzen. Kredit gehört Owen.


Von @Owen Godfrey:

In NSIndexPath werden die Indizes in einem einfachen c-Array namens "_indexes" gespeichert, das als NSUInteger * definiert ist, und die Länge des Arrays wird in "_length" gespeichert, das als NSUInteger definiert ist. Der Accessor "section" ist ein Alias ​​für "_indexes [0]" und sowohl "item" als auch "row" sind Aliase für "_indexes 1 ". Somit sind die beiden funktional identisch.

In Bezug auf den Programmierstil - und möglicherweise die Definitionskette - sollten Sie "Zeile" im Kontext von Tabellen und "Element" im Kontext von Sammlungen verwenden.


Die Kernschnittstelle von NSIndexPath ist in NSIndexPath.h definiert. Die Speicherung der Indizes erfolgt in _indexes, einem privaten eindimensionalen Array von NSUInteger. NSIndexPath selbst kann eine beliebige Anzahl von Dimensionen darstellen. Es gibt zwei relevante Kategorien in NSIndexPath, die die Funktionalität erweitern, eine aus UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" und eine aus UITableView.h "NSIndexPath (UITableView)". Die von UICollectionView.h fügt die schreibgeschützte Eigenschaft "item" und zugehörige Convenience-Methoden hinzu. Die von UITableView.h fügt die schreibgeschützte Eigenschaft "row" und zugehörige Convenience-Methoden hinzu. Beide Eigenschaften sind jedoch nur Wrapper, die auf den zugrunde liegenden Wert in _indexes [1] zugreifen.

Da UIKit mit beiden Kategorien verknüpft ist, sind immer beide Komfortfunktionen verfügbar, unabhängig davon, wo Sie sie unter IOS verwenden. Sie können also einen NSIndexPath aus [NSIndexPath indexPathForRow: inSection:] erstellen, aber den zweiten Index aus indexPath.item abrufen. Der zugrunde liegende Wert ist genau der gleiche, unabhängig davon, ob auf indexPath.item oder indexPath.row zugegriffen wird.

Stilistisch ist es sauberer, wenn Sie "item" mit UICollectionView und "row" mit UITableView verwenden, da diese so verwendet werden sollten, und dies sorgt für besser lesbaren Code. Ihr Programm stürzt jedoch nicht ab, wenn Sie sie austauschen.

Referenz: NSIndexPath


0

Wenn Sie unten in UICollectionView.h nachsehen, sehen Sie die Kategorie, die NSIndexPath erweitert, um sie itemals Eigenschaft hinzuzufügen, wenn sie in UICollectionView-Instanzen verwendet wird.

Am Ende von UITableView.h befindet sich ein ähnlicher Abschnitt, in dem NSIndexPaths hinzugefügt rowund sectionEigenschaften hinzugefügt werden, die in UITableViews verwendet werden.

Wenn Sie versuchen, auf diese Eigenschaften einer NSIndexPath-Instanz innerhalb einer Klasse zuzugreifen, und die NSIndexPathInstance nicht glaubt, dass sie vorhanden sind, importieren Sie einfach den Header der Klasse, die sie definiert, in den oberen Bereich Ihrer Klasse, und Sie können auf magische Weise darauf zugreifen diese Eigenschaften.

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

Um diese Eigenschaften in Ihrer Klasse zu verwenden, müssen Sie die gewünschte wie folgt in Ihre Klasse importieren:

@import "UIKit/UITableView.h"

Und dann können Sie Dinge tun wie: myIndexPath.rowund[myIndexPath row]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.