有谁知道之间的区别NSIndexpath.row
和NSIndexpath.item
?
具体来说,我要在哪一个中使用:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Answers:
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
。
您需要使用 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添加以获取详细信息
@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
查看UICollectionView.h的底部,您将看到扩展NSIndexPath的类别,该类别将item
在UICollectionView实例中使用时作为属性添加。
UITableView.h的底部有一个类似的部分,为UITableViews中使用的NSIndexPaths添加row
和section
属性。
如果您尝试访问一个类中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
的细胞。