web-dev-qa-db-ja.com

NSIndexpath.item vs NSIndexpath.row

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

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

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

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

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

プログラミングスタイル(およびおそらく定義チェーン)の観点では、テーブルのコンテキストでは "row"を使用し、コレクションのコンテキストでは "item"を使用する方が適切です。

180
Owen Godfrey
indexPath.row is best in your case 

NSIndexPathに関する最初の情報

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

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

たとえば、indexPath 1.4.3.2は、図に示すパスを指定します enter image description here

ここであなたの場合_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 itemUICollectionViewとともに適切に使用します。これは読み取り専用のプロパティです。このプロパティを使用するには、で宣言する必要があります
ICollectionView.h

>     Available in iOS 6.0 and later.
27
iPatel

_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 を確認してください

8
Midhun MP

@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

2
spencery2

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]

0
Alex Zavatone