2013-02-08 4 views
51

Kennt jemand den Unterschied zwischen NSIndexpath.row und NSIndexpath.item?NSIndexpath.item vs NSIndexpath.row

Insbesondere die man verwende ich in:

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

ja, die 'row' wird von' UITableView' Zeilen verwendet; Das 'Element 'wird von' UICollectionView'-Zellen verwendet. – holex

Antwort

122

Okay, niemand hat eine gute Antwort hier 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" als NSUInteger definiert. Der Accessor- "Abschnitt" 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 Programmierstil - und vielleicht die Definitionskette - würden Sie besser "Zeile" im Kontext von Tabellen und "Element" im Kontext von Sammlungen verwenden.

+18

Großartig! Es gibt also überhaupt keinen Unterschied. – fatuhoku

+0

Ich mag einfache Antwort über als erklären, wie es funktioniert und so weiter. Gute Arbeit – Codenator81

+0

Wie die Leute so viel darüber wissen, weht mir durch den Kopf, nur die Antwort, nach der ich gesucht habe! vielen Dank! – Dan

9

Sie benötigen indexPath.row

Unterschied zu verwenden ist, dass:

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

Artikel

eine Indexnummer auf ein Element in einem Abschnitt einer Auflistungsansicht identifizieren. (read-only) @property (nonatomic, readonly) NSInteger item;

Discussion

Der Abschnitt der Artikel in ist, wird durch den Wert des Abschnitts identifiziert. Verfügbarkeit

Available in iOS 6.0 and later. 

In UICollectionView.h erklärt


Reihe

eine Indexnummer eine Zeile in einem Abschnitt einer Tabellendarstellung zu identifizieren. (read-only) @property(nonatomic, readonly) NSInteger row;

Discussion

Der Abschnitt in der Reihe ist, wird durch den Wert des Abschnitts identifiziert. Verfügbarkeit

Available in iOS 2.0 and later. 

Bitte überprüfen Sie die NSIndexPath Additions für Details

+2

Was geschieht, wenn Sie von einer 'UICollectionView {Delegate, DataSource}' auf 'row' zugreifen oder wenn Sie von einer' UITableView {Delegate, DataSource} '' item' zugreifen? – fatuhoku

+0

Sie erhalten eine Zugriffsverletzung oder schlechter – iosengineer

+5

wird es noch funktionieren – Lirik

25
indexPath.row is best in your case 

Erste Informationen über NSIndexPath

Die NSIndexPath Klasse in einem Baum von verschachtelten Array den Pfad zu einem bestimmten Knoten repräsentiert Sammlungen. Dieser Pfad ist als Indexpfad bekannt.

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

Zum Beispiel, der IndexPath 1.4.3.2 gibt den Pfad in Abbildung enter image description here

Hier im gezeigten Fall indexPath.row an der spezifischen indexPath den Index der Zeile zurückgibt.

Unterschiede zwischenindexPath.row and indexPath.item

Allgemeinen indexPath hat zwei Eigenschaften

1 - Reihe

2 - Artikel

Reihe - Nutzungsart mit UITableView für bestimmte Reihe Basis auf indexPath bekommen. es ist auch nur Eigenschaft

Available in iOS 2.0 and later. 

Artikel lesen - richtig mit UICollectionView verwenden für Artikel in Abschnitt zu erhalten. Es ist eine schreibgeschützte Eigenschaft. Um diese Eigenschaft zu verwenden, müssen Sie erklären es in
UICollectionView.h

>  Available in iOS 6.0 and later. 
+0

Sie hätten gerade die NSIndexPath Class Reference-Link, weißt du? – esh

+19

Vielleicht, aber es wird generell empfohlen, relevante Teile in die Antwort selbst aufzunehmen. Angesichts der Tatsache, dass die anderen Antworten eine zu enge Antwort gaben, schätze ich jemanden, der auf die breitere Verwendung von "NSIndexPath" hinweist. – Rob

+4

Ich sehe immer noch keine Erwähnung von indexPath.item, während eines der Dinge, die die Frage stellte, war der Unterschied zwischen indexPath.item und indexPath.row. Midhun MP's Antwort tut das. Nur Kopieren-Einfügen-Dokumentation hilft nicht viel ohne ein wenig Aufwand. – esh

1

@Owen Godfreys Antwort ist besser als die angenommene Antwort von @iPatel. Hier ist eine weitere Erläuterung, die ich nicht in einen Kommentar zu seiner Antwort einfügen konnte, also werde ich seine Antwort kopieren und hier hinzufügen. Kredit gehört Owen.


Von @Owen Godfrey:

Innerhalb NSIndexPath werden die Indizes in einem einfachen c Array namens "_indexes" definiert als NSUInteger * und die Länge des Arrays in "_length" definiert als gespeichert gespeichert NSUInteger. Der Accessor- "Abschnitt" 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 Programmierstil - und vielleicht die Definitionskette - würden Sie besser "Zeile" im Kontext von Tabellen und "Element" im Kontext von Sammlungen verwenden.


Die Kernschnittstelle von NSIndexPath ist in NSIndexPath.h definiert. Der Speicher der Indizes befindet sich in _indexes, einem privaten eindimensionalen Array von NSUInteger. NSIndexPath selbst kann beliebig viele Dimensionen darstellen. Es gibt zwei relevante Kategorien für NSIndexPath, die die Funktionalität erweitern, eine aus UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" und eine aus UITableView.h "NSIndexPath (UITableView)". Der Eintrag aus UICollectionView.h fügt die readonly -Eigenschaft "item" und zugehörige Convenience-Methoden hinzu. Der Eintrag aus 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 beide Komfortfunktionen immer verfügbar, unabhängig davon, wo sie in IOS verwendet werden. Sie können also einen NSIndexPath von [NSIndexPath indexPathForRow: inSection:] erstellen, aber den zweiten Index von indexPath.item abrufen. Der zugrunde liegende Wert ist genau derselbe, 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, so wie sie verwendet werden sollten, und das macht lesbareren Code. Ihr Programm wird jedoch nicht abstürzen, wenn Sie sie austauschen.

Referenz: NSIndexPath

0

Blick auf die Unterseite von UICollectionView.h und Sie erhalten die Kategorie sehen, die NSIndexPath item als Eigenschaft hinzufügen erstreckt, wenn innerhalb von für UICollectionView Instanzen verwendet.

Es gibt einen ähnlichen Abschnitt am unteren Rand von UITableView.h, der die Eigenschaften row und section für NSIndexPaths hinzufügt, die in UITableViews verwendet werden.

Wenn Sie versuchen, auf diese Eigenschaften einer NSIndexPath-Instanz innerhalb einer Klasse zuzugreifen, und die NSIndexPathInstance glaubt nicht, dass sie da sind, importieren Sie einfach die Kopfzeile der Klasse, die sie definiert, an die Spitze Ihrer Klasse und Sie werden es magisch in der Lage sein, auf diese Eigenschaften zuzugreifen.

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 verwenden Sie den gewünschten Satz aus in die Klasse importieren, etwa so:

@import "UIKit/UITableView.h"

Und dann können Sie Dinge wie machen e: myIndexPath.row und [myIndexPath row]