Хтось знає різницю між 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
Клас являє собою шлях до певного вузла в дереві вкладених колекцій масиву. Цей шлях відомий як шлях індексу.
Кожен індекс у 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
.
Вам потрібно використовувати 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 для отримання детальної інформації
Відповідь @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
Погляньте внизу 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]
row
використовуєтьсяUITableView
рядками;item
використовуєтьсяUICollectionView
клітинами.