NSIndexpath.item ve NSIndexpath.row


83

NSIndexpath.rowVe arasındaki farkı bilen var mı NSIndexpath.item?

Özellikle, hangisinde kullanıyorum:

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

2
evet, satırlar rowtarafından kullanılır UITableView; itemtarafından kullanılan UICollectionViewhücreler.
holex

Yanıtlar:


204

Tamam, burada kimse iyi bir cevap vermedi.

NSIndexPath içinde, dizinler NSUInteger * olarak tanımlanan "_indexes" adlı basit bir c dizisinde saklanır ve dizinin uzunluğu, NSUInteger olarak tanımlanan "_length" içinde saklanır. Erişimci "bölümü", "_indexes [0]" için bir takma addır ve hem "öğe" hem de "satır", "_indexes [1]" için takma addır. Bu nedenle ikisi işlevsel olarak aynıdır.

Programlama stili - ve belki de tanım zinciri açısından - tablolar bağlamında "satır" ve koleksiyonlar bağlamında "öğe" kullanmak daha iyi olur.


29
indexPath.row is best in your case 

NSIndexPath hakkında ilk bilgi

NSIndexPathSınıf iç içe dizi koleksiyonlarından bir ağaçta belirli düğüme yolu temsil eder. Bu yol, bir dizin yolu olarak bilinir.

Bir indexPath içindeki her bir dizin, ağaçtaki bir düğümden diğerine, daha derin bir düğüme kadar bir alt düğüm dizisi içindeki dizini temsil eder.

Örneğin , indexPath 1.4.3.2 , Şekil 2'de gösterilen yolu belirtir. görüntü açıklamasını buraya girin

Burada sizin durumunuzda indexPath.rowbelirli bir satırın dizinini döndürür indexPath.

Arasındaki farklar indexPath.row and indexPath.item

Genel olarak indexPathvar iki özelliği

1 - satır

2 - öğe

row - indexPath üzerinde UITableViewbelirli satır tabanını almak için özellik kullanımı . aynı zamanda salt okunur özelliktir

 Available in iOS 2.0 and later.

öğe - bölümdeki öğeyiUICollectionView almak için ile doğru şekilde kullanın . Salt okunur bir özelliktir. Bu özelliği kullanmak için onu UICollectionView.h içinde bildirmeniz gerekir.

>     Available in iOS 6.0 and later.

NSIndexPath Sınıf Referansı bağlantısını vermiş olabilirsiniz, anlıyor musunuz?
esh

25
Olabilir, ancak genellikle cevabın kendisine ilgili kısımların dahil edilmesi tavsiye edilir. Diğer yanıtların çok dar bir yanıt verdiği göz önüne alındığında, 'nin daha geniş kullanımına işaret eden birini takdir ediyorum NSIndexPath.
Rob

6
Hala indexPath.item'den hiç bahsedilmiyor, oysa sorunun sorduğu şeylerden biri indexPath.item ile indexPath.row arasındaki farktı. Midhun milletvekilinin cevabı bunu yapıyor. Belgeleri kopyalayıp yapıştırmak, bir miktar detaylandırma olmadan pek yardımcı olmaz.
esh

10

Kullanmanız gerekiyor indexPath.row

Fark şudur:

indexPath.row, tableView içindir ve indexPath.item, collectionView içindir .

eşya

Koleksiyon görünümünün bir bölümündeki bir öğeyi tanımlayan bir dizin numarası. (Sadece oku)@property (nonatomic, readonly) NSInteger item;

Tartışma

Öğenin bulunduğu bölüm, bölüm değeri ile tanımlanır. Kullanılabilirlik

Available in iOS 6.0 and later.

UICollectionView.h'de Bildirildi


kürek çekmek

Bir tablo görünümünün bir bölümündeki bir satırı tanımlayan bir dizin numarası. (Sadece oku)@property(nonatomic, readonly) NSInteger row;

Tartışma

Satırın içinde bulunduğu bölüm, bölüm değeriyle tanımlanır. Kullanılabilirlik

Available in iOS 2.0 and later.

Ayrıntılar için lütfen NSIndexPath Eklemelerini kontrol edin


4

@Owen Godfrey'in cevabı, @iPatel'den kabul edilen cevaptan daha iyi. İşte yanıtıyla ilgili bir yoruma sığdıramadığım bazı açıklamalar, bu yüzden cevabını kopyalayıp buraya ekleyeceğim. Kredi Owen'a ait.


@ Owen Godfrey'den:

NSIndexPath içinde, dizinler NSUInteger * olarak tanımlanan "_indexes" adlı basit bir c dizisinde saklanır ve dizinin uzunluğu, NSUInteger olarak tanımlanan "_length" içinde saklanır. Erişimci "bölümü", "_indexes [0]" için bir takma addır ve hem "öğe" hem de "satır", "_indexes 1 " için takma addır . Bu nedenle ikisi işlevsel olarak aynıdır.

Programlama stili - ve belki de tanım zinciri açısından - tablolar bağlamında "satır" ve koleksiyonlar bağlamında "öğe" kullanmak daha iyi olur.


NSIndexPath'in çekirdek arabirimi NSIndexPath.h'de tanımlanmıştır. Dizinlerin depolanması, NSUInteger'ın özel bir tek boyutlu dizisi olan _indexes içindedir. NSIndexPath tek başına herhangi bir sayıda boyutu temsil edebilir. NSIndexPath üzerinde işlevselliği genişleten iki ilgili kategori vardır, biri UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" ve biri UITableView.h "NSIndexPath (UITableView)". UICollectionView.h dosyasından biri salt okunur özelliği "öğe" ve ilgili kolaylık yöntemlerini ekler. UITableView.h dosyasından biri salt okunur özelliği "satır" ve ilgili kolaylık yöntemlerini ekler. Ancak, her iki özellik de _indexes [1] 'deki temel değere erişen sarmalayıcılardır.

UIKit her iki kategoriye de bağlandığından, IOS'un neresinde kullanıyor olursanız olun, her iki kolaylık işlevi de her zaman kullanılabilir. Böylece [NSIndexPath indexPathForRow: inSection:] 'dan bir NSIndexPath oluşturabilir, ancak indexPath.item'den ikinci dizini alabilirsiniz. Temel değer, indexPath.item veya indexPath.row tarafından erişilse de tam olarak aynıdır.

UICollectionView ile "öğe" ve UITableView ile "satır" kullanırsanız, biçimsel olarak daha temizdir, çünkü bu şekilde kullanılması amaçlanmıştır ve bu daha okunabilir kod sağlar. Ancak, bunları değiştirirseniz programınız çökmez.

Referans: NSIndexPath


0

UICollectionView.h dosyasının altına bakın ve itemUICollectionView örnekleri için kullanıldığında NSIndexPath'i bir özellik olarak eklemek üzere genişleten kategoriyi göreceksiniz .

UITableView.h'nin altında, UITableViews'ta kullanılan NSIndexPaths için özellikler ekleyen rowve sectionözellikleri ekleyen benzer bir bölüm vardır.

Bir sınıf içindeki NSIndexPath örneğinin bu özelliklerine erişmeye çalışıyorsanız ve NSIndexPathInstance bunların orada olduğuna inanmıyorsa, onları tanımlayan sınıfın başlığını sınıfınızın en üstüne içe aktarın ve sihirli bir şekilde erişebileceksiniz. bu özellikler.

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

Bu özellikleri sınıfınızda kullanmak için istediğiniz özelliği sınıfınıza şu şekilde aktarmanız gerekir:

@import "UIKit/UITableView.h"

Ve sonra şu gibi şeyler yapabilirsiniz: myIndexPath.rowve[myIndexPath row]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.