NSIndexpath.item против NSIndexpath.row

83

Кто-нибудь знает разницу между NSIndexpath.rowиNSIndexpath.item ?

В частности, какой из них я использую:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Cyberpass
источник
2
да, rowиспользуется по UITableViewстрокам; itemиспользуется UICollectionViewклетками.
holex

Ответы:

204

Хорошо, здесь никто не дал хорошего ответа.

Внутри NSIndexPath индексы хранятся в простом массиве c, называемом «_indexes», определенном как NSUInteger *, а длина массива сохраняется в «_length», определенном как NSUInteger. Аксессор «section» является псевдонимом для «_indexes [0]», а «элемент» и «строка» являются псевдонимами для «_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 - правильно использовать with UICollectionViewдля получения предмета в разделе. Это свойство только для чтения. Чтобы использовать это свойство, вам необходимо объявить его в
UICollectionView.h

>     Available in iOS 6.0 and later.
iPatel
источник
Вы могли просто дать ссылку на класс NSIndexPath, понимаете?
esh
25
Возможно, но обычно рекомендуется включать соответствующие части в сам ответ. Учитывая, что другие ответы дали слишком узкий ответ, я ценю того, кто указывает на более широкое использование NSIndexPath.
Роб
6
Я до сих пор не вижу упоминания indexPath.item, тогда как одна из вещей, которые задавал вопрос, заключалась в различии между indexPath.item и indexPath.row. Ответ Midhun MP делает это. Простое копирование и вставка документации без некоторой доработки не поможет.
esh
10

Вам нужно использовать indexPath.row

Разница в том, что:

indexPath.row предназначен для tableView, а indexPath.item - для collectionView .

вещь

Номер индекса, идентифицирующий элемент в разделе представления коллекции. (только для чтения)@property (nonatomic, readonly) NSInteger item;

Обсуждение

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

Available in iOS 6.0 and later.

Объявлено в UICollectionView.h


строка

Номер индекса, определяющий строку в разделе табличного представления. (только для чтения)@property(nonatomic, readonly) NSInteger row;

Обсуждение

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

Available in iOS 2.0 and later.

Пожалуйста, проверьте дополнения NSIndexPath для деталей

Midhun MP
источник
4

Ответ @Owen Godfrey лучше, чем принятый ответ от @iPatel. Вот некоторые дополнительные пояснения, которые я не смог уместить в комментарии к его ответу, поэтому я скопирую его ответ и добавлю к нему здесь. Кредит принадлежит Оуэну.


От @Owen Godfrey:

Внутри NSIndexPath индексы хранятся в простом массиве c, называемом «_indexes», определенном как NSUInteger *, а длина массива сохраняется в «_length», определенном как NSUInteger. Аксессор «section» является псевдонимом для «_indexes [0]», а «элемент» и «строка» являются псевдонимами для «_indexes 1 ». Таким образом, они функционально идентичны.

С точки зрения стиля программирования - и, возможно, цепочки определений - вам будет лучше использовать «строку» в контексте таблиц и «элемент» в контексте коллекций.


Основной интерфейс NSIndexPath определен в NSIndexPath.h. Хранение индексов находится в _indexes, который является частным одномерным массивом NSUInteger. NSIndexPath сам по себе может представлять любое количество измерений. В NSIndexPath есть две соответствующие категории, которые расширяют функциональные возможности: одна из UICollectionView.h «NSIndexPath (UICollectionViewAdditions)» и одна из UITableView.h «NSIndexPath (UITableView)». Один из UICollectionView.h добавляет свойство readonly "item" и связанные с ним удобные методы. Один из UITableView.h добавляет свойство «row» только для чтения и связанные с ним удобные методы. Однако оба свойства являются просто оболочками, которые обращаются к базовому значению в _indexes [1].

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

Стилистически будет чище, если вы используете «элемент» с UICollectionView и «строку» с UITableView, поскольку именно так они и были предназначены для использования, и это делает код более читаемым. Однако ваша программа не выйдет из строя, если вы поменяете их местами.

Ссылка: NSIndexPath

spencery2
источник
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]

Алекс Заватоне
источник