Czy ktoś zna różnicę między NSIndexpath.row
i NSIndexpath.item
?
W szczególności, którego używam w:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
ios
uitableview
nsindexpath
Cyberpass
źródło
źródło
row
jest używany przezUITableView
rzędy;item
jest wykorzystywany przezUICollectionView
komórki.Odpowiedzi:
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.
źródło
indexPath.row is best in your case
Pierwsze informacje o NSIndexPath
NSIndexPath
Klasa 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
Tutaj w twoim przypadku
indexPath.row
zwraca indeks wiersza w konkretnymindexPath
.Różnice pomiędzy
indexPath.row and indexPath.item
Generalnie
indexPath
ma dwie właściwościwiersz - użycie właściwości w
UITableView
celu uzyskania określonej bazy wiersza w indexPath. jest również własnością tylko do odczytuitem - prawidłowo użyj z,
UICollectionView
aby uzyskać element w sekcji. Jest to właściwość tylko do odczytu. Aby użyć tej właściwości, musisz zadeklarować ją wUICollectionView.h
> Available in iOS 6.0 and later.
źródło
NSIndexPath
.Musisz użyć
indexPath.row
Różnica jest taka, że:
indexPath.row jest dla tableView, a indexPath.item dla collectionView .
Proszę sprawdzić dodatki NSIndexPath, aby uzyskać szczegółowe informacje
źródło
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
źródło
Spójrz na dół UICollectionView.h, a zobaczysz kategorię, która rozszerza NSIndexPath, aby dodać ją
item
jako właściwość, gdy jest używana w instancjach UICollectionView.Na dole UITableView.h znajduje się podobna sekcja, która dodaje
row
isection
wł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.row
i[myIndexPath row]
źródło