NSIndexpath.item vs NSIndexpath.row

83

Czy ktoś zna różnicę między NSIndexpath.rowi NSIndexpath.item?

W szczególności, którego używam w:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Cyberpass
źródło
2
tak, rowjest używany przez UITableViewrzędy; itemjest wykorzystywany przez UICollectionViewkomórki.
holex

Odpowiedzi:

204

Okay, nikt nie udzielił tutaj dobrej odpowiedzi.

Wewnątrz NSIndexPath indeksy są przechowywane w prostej tablicy c zwanej „_indexes” zdefiniowanej jako NSUInteger *, a długość tablicy jest przechowywana w „_length” zdefiniowanej jako NSUInteger. „Sekcja” akcesora jest aliasem „_indexes [0]”, a zarówno „item”, jak i „row” są aliasami „_indexes [1]”. Tak więc oba są funkcjonalnie identyczne.

Jeśli chodzi o styl programowania - i być może łańcuch definicji - lepiej byłoby użyć wyrażenia „row” w kontekście tabel, a „item” w kontekście kolekcji.

Owen Godfrey
źródło
29
indexPath.row is best in your case 

Pierwsze informacje o NSIndexPath

NSIndexPathKlasa reprezentuje ścieżkę do węzła określonego w drzewo zagnieżdżonych zbiorów tablicy. Ta ścieżka jest nazywana ścieżką indeksu.

Każdy indeks w indexPath reprezentuje indeks w tablicy dzieci z jednego węzła w drzewie do innego, głębszego węzła.

Na przykład indexPath 1.4.3.2 określa ścieżkę pokazaną na rysunku wprowadź opis obrazu tutaj

Tutaj w twoim przypadku indexPath.rowzwraca indeks wiersza w konkretnym indexPath.

Różnice pomiędzy indexPath.row and indexPath.item

Generalnie indexPathma dwie właściwości

1 - rząd

2 - poz

wiersz - użycie właściwości w UITableViewcelu uzyskania określonej bazy wiersza w indexPath. jest również własnością tylko do odczytu

 Available in iOS 2.0 and later.

item - prawidłowo użyj z, UICollectionViewaby uzyskać element w sekcji. Jest to właściwość tylko do odczytu. Aby użyć tej właściwości, musisz zadeklarować ją w
UICollectionView.h

>     Available in iOS 6.0 and later.
iPatel
źródło
Mogłeś właśnie podać odnośnik do klasy NSIndexPath, wiesz?
esh
25
Być może, ale ogólnie zaleca się zawarcie odpowiednich fragmentów w samej odpowiedzi. Biorąc pod uwagę, że inne odpowiedzi dały zbyt wąską odpowiedź, doceniam kogoś, kto zwraca uwagę na szersze zastosowanie NSIndexPath.
Rob
6
Nadal nie widzę wzmianki o indexPath.item, podczas gdy jedną z rzeczy, o które pytano, była różnica między indexPath.item i indexPath.row. Odpowiedź Midhun MP to robi. Samo kopiowanie i wklejanie dokumentacji nie pomaga zbytnio bez pewnego dopracowania.
esh
10

Musisz użyć indexPath.row

Różnica jest taka, że:

indexPath.row jest dla tableView, a indexPath.item dla collectionView .

pozycja

Numer indeksu identyfikujący element w sekcji widoku kolekcji. (tylko czytać)@property (nonatomic, readonly) NSInteger item;

Dyskusja

Sekcja, w której znajduje się pozycja, jest identyfikowana przez wartość sekcji. Dostępność

Available in iOS 6.0 and later.

Zadeklarowane w UICollectionView.h


rząd

Numer indeksu identyfikujący wiersz w sekcji widoku tabeli. (tylko czytać)@property(nonatomic, readonly) NSInteger row;

Dyskusja

Sekcja, w której znajduje się wiersz, jest identyfikowana przez wartość sekcji. Dostępność

Available in iOS 2.0 and later.

Proszę sprawdzić dodatki NSIndexPath, aby uzyskać szczegółowe informacje

Midhun MP
źródło
4

Odpowiedź @Owen Godfrey jest lepsza niż zaakceptowana odpowiedź od @iPatel. Oto dalsze wyjaśnienia, których nie byłem w stanie dopasować do komentarza na temat jego odpowiedzi, więc skopiuję jego odpowiedź i dodam do niej tutaj. Kredyt należy do Owena.


Od @Owen Godfrey:

Wewnątrz NSIndexPath indeksy są przechowywane w prostej tablicy c zwanej „_indexes” zdefiniowanej jako NSUInteger *, a długość tablicy jest przechowywana w „_length” zdefiniowanej jako NSUInteger. „Sekcja” akcesora jest aliasem „_indexes [0]”, a zarówno „item”, jak i „row” są aliasami „_indexes 1 ”. Tak więc oba są funkcjonalnie identyczne.

Jeśli chodzi o styl programowania - i być może łańcuch definicji - lepiej byłoby użyć wyrażenia „row” w kontekście tabel, a „item” w kontekście kolekcji.


Główny interfejs NSIndexPath jest zdefiniowany w NSIndexPath.h. Indeksy są przechowywane w _indexes, czyli prywatnej jednowymiarowej tablicy NSUInteger. Sam NSIndexPath może reprezentować dowolną liczbę wymiarów. Istnieją dwie odpowiednie kategorie na NSIndexPath, które rozszerzają funkcjonalność, jedna z UICollectionView.h „NSIndexPath (UICollectionViewAdditions)” i jedna z UITableView.h „NSIndexPath (UITableView)”. Ten z UICollectionView.h dodaje właściwość tylko do odczytu „item” i powiązane wygodne metody. Ten z UITableView.h dodaje właściwość readonly „row” i powiązane metody wygody. Jednak obie właściwości są tylko opakowaniami, które uzyskują dostęp do podstawowej wartości w _indexes [1].

Ponieważ UIKit łączy się z obiema kategoriami, oba zestawy wygodnych funkcji są zawsze dostępne, bez względu na to, gdzie w IOS ich używasz. Możesz więc utworzyć NSIndexPath z [NSIndexPath indexPathForRow: inSection:], ale pobrać drugi indeks z indexPath.item. Bazowa wartość jest dokładnie taka sama, niezależnie od tego, czy jest dostępna za pomocą indexPath.item czy indexPath.row.

Stylistycznie jest bardziej przejrzyste, jeśli użyjesz „item” z UICollectionView i „row” z UITableView, ponieważ w ten sposób zostały one użyte, a to sprawia, że ​​kod jest bardziej czytelny. Jednak program nie ulegnie awarii, jeśli je zamienisz.

Odniesienie: NSIndexPath

spencery2
źródło
0

Spójrz na dół UICollectionView.h, a zobaczysz kategorię, która rozszerza NSIndexPath, aby dodać ją itemjako właściwość, gdy jest używana w instancjach UICollectionView.

Na dole UITableView.h znajduje się podobna sekcja, która dodaje rowi sectionwłaściwości dla NSIndexPaths, które są używane w UITableViews.

Jeśli próbujesz uzyskać dostęp do tych właściwości instancji NSIndexPath w klasie, a NSIndexPathInstance nie wierzy, że tam są, po prostu zaimportuj nagłówek klasy, która je definiuje, do górnej części swojej klasy, a będziesz w magiczny sposób uzyskać dostęp te właściwości.

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

Aby użyć tych właściwości w swojej klasie, musisz zaimportować żądaną do swojej klasy w następujący sposób:

@import "UIKit/UITableView.h"

A potem możesz zrobić takie rzeczy jak: myIndexPath.rowi[myIndexPath row]

Alex Zavatone
źródło