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;
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.
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 konkretnym indexPath
.
Różnice pomiędzy indexPath.row and indexPath.item
Generalnie indexPath
ma dwie właściwości
1 - rząd
2 - poz
wiersz - użycie właściwości w UITableView
celu 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, 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ą w
UICollectionView.h
> Available in iOS 6.0 and later.
NSIndexPath
.
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
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
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
i section
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]
row
jest używany przezUITableView
rzędy;item
jest wykorzystywany przezUICollectionView
komórki.