NSIndexpath.row
Ve arasındaki farkı bilen var mı NSIndexpath.item
?
Özellikle, hangisinde kullanıyorum:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Yanıtlar:
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.
indexPath.row is best in your case
NSIndexPath hakkında ilk bilgi
NSIndexPath
Sı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.
Burada sizin durumunuzda indexPath.row
belirli bir satırın dizinini döndürür indexPath
.
Arasındaki farklar indexPath.row and indexPath.item
Genel olarak indexPath
var iki özelliği
1 - satır
2 - öğe
row - indexPath üzerinde UITableView
belirli 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
.
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
@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
UICollectionView.h dosyasının altına bakın ve item
UICollectionView ö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 row
ve 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.row
ve[myIndexPath row]
row
tarafından kullanılırUITableView
;item
tarafından kullanılanUICollectionView
hücreler.