NSIndexpath.itemとNSIndexpath.row


83

NSIndexpath.rowとの違いを知っている人はいNSIndexpath.itemますか?

具体的には、どちらを使用しますか:

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

2
はい、行rowで使用されUITableViewます。これitemUICollectionViewセルによって使用されます。
holex 2016年

回答:


204

さて、ここでは誰も良い答えを出していません。

NSIndexPath内では、インデックスはNSUInteger *として定義された「_indexes」と呼ばれる単純なc配列に格納され、配列の長さはNSUIntegerとして定義された「_length」に格納されます。アクセサ「section」は「_indexes [0]」のエイリアスであり、「item」と「row」は両方とも「_indexes [1]」のエイリアスです。したがって、2つは機能的に同一です。

プログラミングスタイル(そしておそらく定義チェーン)の観点からは、テーブルのコンテキストでは「行」を使用し、コレクションのコンテキストでは「アイテム」を使用する方がよいでしょう。


29
indexPath.row is best in your case 

NSIndexPathに関する最初の情報

このNSIndexPathクラスは、ネストされた配列コレクションのツリー内の特定のノードへのパスを表します。このパスは、インデックスパスと呼ばれます。

indexPathの各インデックスは、ツリー内の1つのノードから別のより深いノードへの子の配列へのインデックスを表します。

例えば、indexPath 1.4.3.2図示指定パス ここに画像の説明を入力してください

ここであなたの場合indexPath.row、特定ので行のインデックスを返します indexPath

間の違い indexPath.row and indexPath.item

一般的indexPath2つのプロパティがあります

1-

2-アイテム

row- indexPathでUITableView特定のベースを取得するために使用するプロパティ。読み取り専用プロパティでもあります

 Available in iOS 2.0 and later.

item-セクション内のアイテムUICollectionViewを取得するために適切に使用します。読み取り専用のプロパティです。このプロパティを使用するには、UICollectionView.hで宣言する必要があります

>     Available in iOS 6.0 and later.

NSIndexPathクラスリファレンスリンクを指定することもできますね。
esh 2013

25
おそらく、しかし一般的には、回答自体に関連する部分を含めることをお勧めします。他の回答では回答が狭すぎることを考えると、の幅広い使用法を指摘してくれた人に感謝しNSIndexPathます。
ロブ

6
indexPath.itemについてはまだ言及されていませんが、質問の1つは、indexPath.itemとindexPath.rowの違いでした。MidhunMPの答えはそれをします。ドキュメントをコピーして貼り付けるだけでは、ある程度の詳細がなければあまり役に立ちません。
esh 2013

10

あなたは使用する必要があります 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の追加を確認してください


4

@Owen Godfreyの回答は、@ iPatelから受け入れられた回答よりも優れています。これは私が彼の答えのコメントに収めることができなかったいくつかのさらなる説明です、それで私は彼の答えをコピーしてここに追加します。クレジットはオーウェンに帰属します。


@Owen Godfreyから:

NSIndexPath内では、インデックスはNSUInteger *として定義された「_indexes」と呼ばれる単純なc配列に格納され、配列の長さはNSUIntegerとして定義された「_length」に格納されます。アクセッサ「セクション」は「_indexes [0]」と「項目」と「行」の両方にエイリアスである「_indexesにエイリアスされている1」。したがって、2つは機能的に同一です。

プログラミングスタイル(そしておそらく定義チェーン)の観点からは、テーブルのコンテキストでは「行」を使用し、コレクションのコンテキストでは「アイテム」を使用する方がよいでしょう。


NSIndexPathのコアインターフェイスはNSIndexPath.hで定義されています。インデックスの格納は、NSUIntegerのプライベート1次元配列である_indexesにあります。NSIndexPath自体は、任意の数のディメンションを表すことができます。NSIndexPathには、機能を拡張する2つの関連カテゴリがあります。1つはUICollectionView.h "NSIndexPath(UICollectionViewAdditions)"からのもので、もう1つはUITableView.h "NSIndexPath(UITableView)"からのものです。UICollectionView.hからのものは、読み取り専用プロパティ「item」と関連する便利なメソッドを追加します。UITableView.hからのものは、読み取り専用プロパティ「row」および関連する便利なメソッドを追加します。ただし、どちらのプロパティも、_indexes [1]の基になる値にアクセスする単なるラッパーです。

UIKitは両方のカテゴリにリンクしているため、IOSのどこで使用していても、便利な機能の両方のセットを常に使用できます。したがって、[NSIndexPath indexPathForRow:inSection:]からNSIndexPathを作成できますが、indexPath.itemから2番目のインデックスを取得できます。基になる値は、indexPath.itemまたはindexPath.rowのどちらからアクセスしてもまったく同じです。

UICollectionViewで「item」を使用し、UITableViewで「row」を使用すると、スタイル的にはよりクリーンになります。これにより、コードが読みやすくなります。ただし、それらを交換してもプログラムはクラッシュしません。

参照:NSIndexPath


0

UICollectionView.hの下部を見るとitem、UICollectionViewインスタンス内で使用されるときに、NSIndexPathを拡張してプロパティとして追加するカテゴリが表示されます。

追加UITableView.hの下部に同様の部分があるrowsectionUITableViewsで使用されるNSIndexPathsのプロパティが。

クラス内の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]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.