Кто-нибудь знает разницу между NSIndexpath.row
и NSIndexpath.item
?
В частности, какой из них я использую в:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Кто-нибудь знает разницу между NSIndexpath.row
и NSIndexpath.item
?
В частности, какой из них я использую в:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Хорошо, никто не дал здесь хорошего ответа.
Внутри NSIndexPath индексы хранятся в простом массиве c, называемом "_indexes", определяемом как NSUInteger *, и длина массива хранится в "_length", определенном как NSUInteger. Раздел "Аксессор" - это псевдоним "_indexes [0]", и "item" и "row" являются псевдонимами для "_indexes [1]". Таким образом, они функционально идентичны.
С точки зрения стиля программирования и, возможно, цепочки определения, вам лучше использовать "строку" в контексте таблиц и "элемент" в контексте коллекций.
indexPath.row is best in your case
Первая информация о NSIndexPath
Класс NSIndexPath
представляет путь к определенному node в дереве вложенных массивов массивов. Этот путь известен как путь указателя.
Каждый индекс в indexPath представляет индекс в массив дочерних элементов из одного node в дереве на другой, глубже node.
Например, indexPath 1.4.3.2 указывает путь, показанный на рисунке
Здесь в вашем случае indexPath.row
возвращает индекс строки в конкретном indexPath
.
Различия между indexPath.row and indexPath.item
Обычно indexPath
имеет два свойства
1 - строка
2 - элемент
строка - используется с UITableView
для получения конкретной строки базы на indexPath. это также свойство read only
Available in iOS 2.0 and later.
item - правильно использовать с UICollectionView
для получения элемента в разделе. Это свойство только для чтения. Чтобы использовать это свойство, вам нужно объявить его в
UICollectionView.h
> Available in iOS 6.0 and later.
Вам нужно использовать indexPath.row
Разница в том, что:
indexPath.row для tableView и indexPath.item предназначен для коллекцииView.
элемент
Номер индекса, идентифицирующий элемент в разделе просмотра коллекции. (только для чтения)
@property (nonatomic, readonly) NSInteger item;
Обсуждение
Раздел, в котором находится элемент, идентифицируется значением раздела. Наличие
Available in iOS 6.0 and later.
Объявлено в UICollectionView.h
строка
Номер индекса, определяющий строку в разделе представления таблицы. (только для чтения)
@property(nonatomic, readonly) NSInteger row;
Обсуждение
Раздел, в котором находится строка, идентифицируется значением раздела. Наличие
Available in iOS 2.0 and later.
Подробнее о Добавления NSIndexPath
@Owen Godfrey ответ лучше, чем принятый ответ от @iPatel. Вот еще одно разъяснение, которое я не смог вставить в комментарий к его ответу, поэтому я скопирую его ответ и добавлю сюда. Кредит принадлежит Оуэну.
От @Owen Годфри:
Внутри NSIndexPath индексы хранятся в простом массиве c, называемом "_indexes", определяемом как NSUInteger *, и длина массива хранится в "_length", определенном как NSUInteger. Раздел "Accessor" является псевдонимом "_indexes [0]", и оба "item" и "row" являются псевдонимами для "_indexes 1", Таким образом, они функционально идентичны.
С точки зрения стиля программирования и, возможно, цепочки определения, вам лучше использовать "строку" в контексте таблиц и "элемент" в контексте коллекций.
Основной интерфейс NSIndexPath определяется в NSIndexPath.h. Хранение индексов находится в _indexes, который является частным одномерным массивом NSUInteger. NSIndexPath сам по себе может представлять любое количество измерений. На NSIndexPath есть две соответствующие категории, которые расширяют функциональные возможности: один из UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" и один из UITableView.h "NSIndexPath (UITableView)". Один из UICollectionView.h добавляет свойство "item" readonly и связанные с ним методы удобства. Один из UITableView.h добавляет свойство "строка" readonly и связанные с ним методы удобства. Однако оба свойства - это просто оболочки, которые получают доступ к базовому значению в _indexes [1].
Поскольку UIKit связывается с обеими категориями, оба набора удобных функций всегда доступны, независимо от того, где в IOS вы их используете. Поэтому вы можете создать NSIndexPath из [NSIndexPath indexPathForRow: inSection:], но получить второй индекс из indexPath.item. Базовое значение точно такое же, независимо от того, обратился ли он к indexPath.item или indexPath.row.
Стилистически более чисто, если вы используете "элемент" с UICollectionView и "row" с UITableView, так как они предназначены для использования, и это делает более читаемым код. Однако ваша программа не будет разбиваться, если вы их замените.
Ссылка: NSIndexPath
Посмотрите на нижнюю часть 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]