NSIndexpath.item проти NSIndexpath.row


83

Хтось знає різницю між NSIndexpath.rowі NSIndexpath.item?

Зокрема, який із них я використовую в:

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

2
так, the rowвикористовується UITableViewрядками; itemвикористовується UICollectionViewклітинами.
holex

Відповіді:


204

Гаразд, тут ніхто не дав належної відповіді.

Усередині NSIndexPath індекси зберігаються у простому масиві c, який називається "_indexes", визначеному як NSUInteger *, а довжина масиву зберігається в "_length", визначеному як NSUInteger. "Розділ" доступу є псевдонімом "_indexes [0]", і "item", і "row" є псевдонімами "_indexes [1]". Таким чином, ці два функціонально однакові.

З точки зору стилю програмування - і, можливо, ланцюжка визначень - вам було б краще використовувати "рядок" у контексті таблиць, а "елемент" у контексті колекцій.


29
indexPath.row is best in your case 

Перша інформація про NSIndexPath

NSIndexPathКлас являє собою шлях до певного вузла в дереві вкладених колекцій масиву. Цей шлях відомий як шлях індексу.

Кожен індекс у indexPath представляє індекс масиву дочірніх елементів від одного вузла дерева до іншого, більш глибокого вузла.

Наприклад , indexPath 1.4.3.2 визначає шлях, показаний на малюнку введіть тут опис зображення

Тут у вашому випадку indexPath.rowповертається індекс рядка за певним indexPath.

Відмінності між indexPath.row and indexPath.item

Як правило, indexPathмає дві властивості

1 - ряд

2 - пункт

row - використання властивості UITableViewдля отримання конкретної бази рядків на indexPath. це також властивість лише для читання

 Available in iOS 2.0 and later.

item - правильно використовувати з UICollectionViewдля отримання елемента в розділі. Це властивість лише для читання. Щоб використовувати це властивість, вам потрібно оголосити його в
UICollectionView.h

>     Available in iOS 6.0 and later.

Ви могли просто дати посилання на посилання на клас NSIndexPath, розумієте?
еш

25
Можливо, але загалом рекомендується включати відповідні частини в саму відповідь. Враховуючи, що інші відповіді дали занадто вузьку відповідь, я ціную того, хто вказує на більш широке використання NSIndexPath.
Роб

6
Я все ще не бачу згадки про indexPath.item, тоді як однією з речей, що задавали питання, була різниця між indexPath.item та indexPath.row. Відповідь депутата Midhun це робить. Просто копіювання документації не надто допомагає без певної деталізації.
esh

10

Вам потрібно використовувати indexPath.row

Різниця полягає в тому, що:

indexPath.row - для tableView, а indexPath.item - для collectionView .

пункт

Номер індексу, що ідентифікує елемент у розділі подання колекції. (лише для читання)@property (nonatomic, readonly) NSInteger item;

Обговорення

Розділ, в якому знаходиться товар, визначається значенням розділу. Доступність

Available in iOS 6.0 and later.

Заявлено в UICollectionView.h


рядок

Номер індексу, що ідентифікує рядок у розділі подання таблиці. (лише для читання)@property(nonatomic, readonly) NSInteger row;

Обговорення

Розділ, у якому знаходиться рядок, визначається значенням section. Доступність

Available in iOS 2.0 and later.

Будь ласка, перевірте Додатки NSIndexPath для отримання детальної інформації


4

Відповідь @Owen Godfrey краща за прийняту відповідь від @iPatel. Ось ще одне роз’яснення, яке я не зміг вписати в коментар щодо його відповіді, тому скопіюю його відповідь і додам до нього тут. Кредит належить Оуену.


Від @Owen Godfrey:

Усередині NSIndexPath індекси зберігаються у простому масиві c, який називається "_indexes", визначеному як NSUInteger *, а довжина масиву зберігається в "_length", визначеному як NSUInteger. "Розділ" доступу є псевдонімом "_indexes [0]", і "item", і "row" є псевдонімами "_indexes 1 ". Таким чином, ці два функціонально однакові.

З точки зору стилю програмування - і, можливо, ланцюжка визначень - вам було б краще використовувати "рядок" у контексті таблиць, а "елемент" у контексті колекцій.


Основний інтерфейс NSIndexPath визначений у NSIndexPath.h. Зберігання індексів знаходиться в _indexes, який є приватним одновимірним масивом NSUInteger. NSIndexPath сам по собі може представляти будь-яку кількість вимірів. У NSIndexPath є дві відповідні категорії, які розширюють функціональність, одна з UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" і одна з UITableView.h "NSIndexPath (UITableView)". Той із UICollectionView.h додає властивість readonly лише "read" та відповідні методи зручності. Той із UITableView.h додає властивість "рядок" лише для читання та відповідні методи зручності. Однак обидва властивості - це просто обгортки, які отримують доступ до базового значення в _indexes [1].

Оскільки UIKit пов'язує обидві категорії, обидва набори зручних функцій завжди доступні, незалежно від того, де в IOS ви їх використовуєте. Таким чином, ви можете створити NSIndexPath з [NSIndexPath indexPathForRow: inSection:], але отримати другий індекс з indexPath.item. Базове значення абсолютно однакове, доступ до нього здійснюється за допомогою indexPath.item або indexPath.row.

Стилістично чистіше, якщо ви використовуєте "item" з UICollectionView та "row" з UITableView, оскільки саме таким чином вони були призначені для використання, і це робить більш читабельним код. Однак ваша програма не вийде з ладу, якщо ви обміняєтесь ними.

Довідково: NSIndexPath


0

Погляньте внизу UICollectionView.h, і ви побачите категорію, яка розширює NSIndexPath для додавання itemяк властивості при використанні в екземплярах UICollectionView.

Існує аналогічний розділ в нижній частині UITableView.h , яка додає rowі sectionвластивості NSIndexPaths, які використовуються в UITableViews.

Якщо ви намагаєтеся отримати доступ до цих властивостей екземпляра NSIndexPath всередині класу, а NSIndexPathInstance не вірить, що вони там є, просто імпортуйте заголовок класу, який визначає їх, у верхню частину вашого класу, і ви магічно зможете отримати доступ ці властивості.

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

Щоб використовувати ці властивості у своєму класі, вам доведеться імпортувати потрібний у свій клас так:

@import "UIKit/UITableView.h"

І тоді ви можете робити такі речі: myIndexPath.rowі[myIndexPath row]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.