NSIndexpath.item和NSIndexpath.row


82

有谁知道之间的区别NSIndexpath.rowNSIndexpath.item

具体来说,我要在哪一个中使用:

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

2
是的,rowUITableView行使用;的item是由所使用UICollectionView的细胞。
Holex

Answers:


204

好的,这里没有人给出好的答案。

在NSIndexPath内部,索引存储在定义为NSUInteger *的名为“ _indexes”的简单c数组中,而数组的长度存储在定义为NSUInteger的“ _length”中。访问者“节”是“ _indexes [0]”的别名,“ item”和“行”都是“ _indexes [1]”的别名。因此,两者在功能上是相同的。

就编程风格(也许是定义链)而言,最好在表的上下文中使用“行”,而在集合的上下文中使用“项”。


28
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-项目

行-财产的使用UITableView为获得特定上indexPath基地。它也是只读属性

 Available in iOS 2.0 and later.

item-正确UICollectionView用于部分中的获取项目。这是一个只读属性。要使用此属性,您需要在UICollectionView.h中声明它

>     Available in iOS 6.0 and later.

您可能刚刚给出了NSIndexPath类引用链接,知道吗?
esh 2013年

24
也许可以,但是通常建议在答案本身中包含相关部分。鉴于其他答案给出的答案过于狭窄,我感谢有人指出了的广泛使用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添加以获取详细信息


4

@Owen Godfrey的答案比@iPatel接受的答案要好。这里有一些进一步的说明,我无法对他的回答发表评论,因此我将复制他的回答并在此处添加。信用属于欧文。


来自@Owen Godfrey:

在NSIndexPath内部,索引存储在定义为NSUInteger *的名为“ _indexes”的简单c数组中,而数组的长度存储在定义为NSUInteger的“ _length”中。访问器“节”是“ _indexes [0]”的别名,“ item”和“ row”都是“ _indexes 1 ”的别名 ”的。因此,两者在功能上是相同的。

就编程风格(也许是定义链)而言,最好在表的上下文中使用“行”,而在集合的上下文中使用“项”。


NSIndexPath.h中定义了NSIndexPath的核心接口。索引的存储在_indexes中,它是NSUInteger的私有一维数组。NSIndexPath本身可以表示任意数量的维度。NSIndexPath上有两个相关类别,它们扩展了功能,一个来自UICollectionView.h“ NSIndexPath(UICollectionViewAdditions)”,另一个来自UITableView.h“ NSIndexPath(UITableView)”。UICollectionView.h中的一个添加了只读属性“ item”和相关的便捷方法。UITableView.h中的一个添加了只读属性“ row”和相关的便捷方法。但是,这两个属性只是包装器,它们访问_indexes [1]中的基础值。

由于UIKit与这两个类别链接,因此无论在IOS中的何处使用它们,两组便利功能始终可用。因此,您可以从[NSIndexPath indexPathForRow:inSection:]创建一个NSIndexPath,但可以从indexPath.item中检索第二个索引。无论是通过indexPath.item还是indexPath.row访问,基础值都完全相同。

从风格上讲,如果将“ item”与UICollectionView一起使用,并将“ row”与UITableView一起使用,这将是更干净的选择,因为这是按预期使用的方式,这使代码更具可读性。但是,如果将它们互换,则程序不会崩溃。

参考:NSIndexPath


0

查看UICollectionView.h的底部,您将看到扩展NSIndexPath的类别,该类别将item在UICollectionView实例中使用时作为属性添加。

UITableView.h的底部有一个类似的部分,为UITableViews中使用的NSIndexPaths添加rowsection属性。

如果您尝试访问一个类中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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.