NSIndexpath.row
とNSIndexpath.item
の違いを知っている人はいますか?
具体的には、私はどちらを使用しますか?
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
さて、誰もここで良い答えをしていません。
NSIndexPath内では、インデックスはNSUInteger *として定義された「_indexes」と呼ばれる単純なc配列に格納され、配列の長さはNSUIntegerとして定義された「_length」に格納されます。アクセサの「セクション」は「_indexes [0]」のエイリアスであり、「アイテム」と「行」は「_indexes [1]」のエイリアスです。したがって、2つは機能的に同じです。
プログラミングスタイル(およびおそらく定義チェーン)の観点では、テーブルのコンテキストでは "row"を使用し、コレクションのコンテキストでは "item"を使用する方が適切です。
indexPath.row is best in your case
NSIndexPathに関する最初の情報
NSIndexPath
クラスは、ネストされた配列コレクションのツリー内の特定のノードへのパスを表します。このパスは、インデックスパスと呼ばれます。
IndexPathの各インデックスは、ツリー内のあるノードから別のより深いノードへの子の配列へのインデックスを表します。
たとえば、indexPath 1.4.3.2は、図に示すパスを指定します
ここであなたの場合_indexPath.row
は、特定のindexPath
にある行のインデックスを返します。
差indexPath.row and indexPath.item
通常、indexPath
には2つのプロパティがあります
1-行
2-アイテム
row-特定の取得のためにUITableView
で使用されるプロパティrow indexPathに基づいて。また、読み取り専用プロパティです
Available in iOS 2.0 and later.
item-セクションのget itemでUICollectionView
とともに適切に使用します。これは読み取り専用のプロパティです。このプロパティを使用するには、で宣言する必要があります
ICollectionView.h
> Available in iOS 6.0 and later.
_indexPath.row
_を使用する必要があります
違いは次のとおりです。
indexPath.rowはtableView用で、indexPath.itemはcollectionView用です。
アイテム
コレクションビューのセクション内のアイテムを識別するインデックス番号。 (読み取り専用)
@property (nonatomic, readonly) NSInteger item;
議論
アイテムが属するセクションは、セクションの値によって識別されます。可用性
_Available in iOS 6.0 and later.
_UICollectionView.hで宣言
row
テーブルビューのセクション内の行を識別するインデックス番号。 (読み取り専用)
@property(nonatomic, readonly) NSInteger row;
議論
行が含まれるセクションは、セクションの値によって識別されます。可用性
_Available in iOS 2.0 and later.
_
詳細については NSIndexPath Additions を確認してください
@Owen Godfreyの回答は、@ iPatelから受け入れられた回答よりも優れています。ここにいくつかのさらなる説明がありますが、私は彼の答えに対するコメントに収まらなかったので、彼の答えをコピーしてここに追加します。クレジットはオーウェンに帰属します。
@Owen Godfreyから:
NSIndexPath内では、インデックスはNSUInteger *として定義された「_indexes」と呼ばれる単純なc配列に格納され、配列の長さはNSUIntegerとして定義された「_length」に格納されます。アクセサーの「セクション」は「_indexes [0]」のエイリアスであり、「アイテム」と「行」は「_indexes 1 」のエイリアスです。したがって、2つは機能的に同じです。
プログラミングスタイル(およびおそらく定義チェーン)の観点では、テーブルのコンテキストでは "row"を使用し、コレクションのコンテキストでは "item"を使用する方が適切です。
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
UICollectionView.hの下部を見ると、NSCollectionPathを拡張してitem
をUICollectionViewインスタンス内で使用するときにプロパティとして追加するカテゴリが表示されます。
UITableViewsの下部には、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]