Có ai biết sự khác biệt giữa NSIndexpath.row
và NSIndexpath.item
?
Cụ thể, tôi sử dụng cái nào trong:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Câu trả lời:
Được rồi, không ai đưa ra câu trả lời hay ở đây.
Bên trong NSIndexPath, các chỉ mục được lưu trữ trong một mảng c đơn giản được gọi là "_indexes" được định nghĩa là NSUInteger * và độ dài của mảng được lưu trữ trong "_length" được định nghĩa là NSUInteger. Trình truy cập "section" là bí danh của "_indexes [0]" và cả "item" và "row" đều là bí danh của "_indexes [1]". Do đó, cả hai giống hệt nhau về mặt chức năng.
Về phong cách lập trình - và có lẽ là chuỗi định nghĩa - tốt hơn bạn nên sử dụng "hàng" trong ngữ cảnh bảng và "mục" trong ngữ cảnh tập hợp.
indexPath.row is best in your case
Thông tin đầu tiên về NSIndexPath
Các NSIndexPath
lớp đại diện cho đường dẫn đến một nút cụ thể trong một cây của các bộ sưu tập mảng lồng nhau. Đường dẫn này được gọi là đường dẫn chỉ mục.
Mỗi chỉ mục trong một indexPath đại diện cho chỉ mục thành một mảng con từ một nút trong cây đến một nút khác sâu hơn.
Ví dụ , indexPath 1.4.3.2 chỉ định đường dẫn được hiển thị trong Hình
Ở đây trong trường hợp của bạn indexPath.row
trả về chỉ mục của hàng cụ thể indexPath
.
Khác biệt giữa indexPath.row and indexPath.item
Nói chung indexPath
có hai thuộc tính
1 - hàng
2 - mặt hàng
row - thuộc tính sử dụng với UITableView
để lấy cơ sở hàng cụ thể trên indexPath. nó cũng là tài sản chỉ đọc
Available in iOS 2.0 and later.
item - sử dụng đúng cách với UICollectionView
for get item trong phần. Nó là một tài sản chỉ đọc. Để sử dụng thuộc tính này, bạn cần khai báo nó trong
UICollectionView.h
> Available in iOS 6.0 and later.
NSIndexPath
.
Bạn cần sử dụng indexPath.row
Sự khác biệt là:
indexPath.row dành cho tableView và indexPath.item dành cho collectionView .
mục
Số chỉ mục xác định một mục trong một phần của chế độ xem bộ sưu tập. (chỉ đọc)
@property (nonatomic, readonly) NSInteger item;
Thảo luận
Phần mà mục có trong được xác định bằng giá trị của phần. khả dụng
Available in iOS 6.0 and later.
Được khai báo trong UICollectionView.h
hàng
Số chỉ mục xác định một hàng trong một phần của chế độ xem bảng. (chỉ đọc)
@property(nonatomic, readonly) NSInteger row;
Thảo luận
Phần mà hàng nằm trong được xác định bằng giá trị của phần. khả dụng
Available in iOS 2.0 and later.
Vui lòng kiểm tra Phần bổ sung NSIndexPath để biết chi tiết
Câu trả lời của @Owen Godfrey tốt hơn câu trả lời được chấp nhận từ @iPatel. Đây là một số giải thích rõ hơn mà tôi không thể đưa vào nhận xét về câu trả lời của anh ấy, vì vậy tôi sẽ sao chép câu trả lời của anh ấy và thêm vào đây. Tín dụng thuộc về Owen.
Từ @Owen Godfrey:
Bên trong NSIndexPath, các chỉ mục được lưu trữ trong một mảng c đơn giản được gọi là "_indexes" được định nghĩa là NSUInteger * và độ dài của mảng được lưu trữ trong "_length" được định nghĩa là NSUInteger. Bộ truy cập "section" là bí danh của "_indexes [0]" và cả "item" và "row" đều là bí danh của "_indexes 1 ". Do đó, cả hai giống hệt nhau về mặt chức năng.
Về phong cách lập trình - và có lẽ là chuỗi định nghĩa - tốt hơn bạn nên sử dụng "hàng" trong ngữ cảnh bảng và "mục" trong ngữ cảnh tập hợp.
Giao diện cốt lõi của NSIndexPath được định nghĩa trong NSIndexPath.h. Việc lưu trữ các chỉ mục trong _indexes là mảng một chiều riêng tư của NSUInteger. NSIndexPath tự nó có thể đại diện cho bất kỳ số thứ nguyên nào. Có hai danh mục liên quan trên NSIndexPath mở rộng chức năng, một từ UICollectionView.h "NSIndexPath (UICollectionViewAdditions)" và một từ UITableView.h "NSIndexPath (UITableView)". Một từ UICollectionView.h thêm thuộc tính chỉ đọc "item" và các phương thức tiện lợi liên quan. Một từ UITableView.h thêm thuộc tính chỉ đọc "hàng" và các phương thức tiện lợi liên quan. Tuy nhiên, cả hai thuộc tính chỉ là trình bao bọc truy cập giá trị cơ bản trong _indexes [1].
Vì UIKit liên kết với cả hai danh mục nên cả hai bộ chức năng tiện lợi luôn có sẵn, bất kể bạn đang sử dụng chúng ở đâu trong IOS. Vì vậy, bạn có thể tạo một NSIndexPath từ [NSIndexPath indexPathForRow: inSection:] nhưng lấy chỉ mục thứ hai từ indexPath.item. Giá trị cơ bản hoàn toàn giống nhau cho dù được indexPath.item hay indexPath.row truy cập.
Về mặt phong cách, nó sẽ gọn gàng hơn nếu bạn sử dụng "item" với UICollectionView và "row" với UITableView vì đó là cách chúng được dự định sử dụng và điều này làm cho mã dễ đọc hơn. Tuy nhiên, chương trình của bạn sẽ không bị lỗi nếu bạn thay đổi chúng.
Tham khảo: NSIndexPath
Nhìn vào cuối UICollectionView.h và bạn sẽ thấy danh mục mở rộng NSIndexPath để thêm item
làm thuộc tính khi được sử dụng trong các cá thể UICollectionView.
Có một phần tương tự ở cuối UITableView.h, phần này bổ sung row
và section
các thuộc tính cho các đường dẫn NSIndexPath được sử dụng trong UITableViews.
Nếu bạn đang cố gắng truy cập các thuộc tính này của một cá thể NSIndexPath trong một lớp và NSIndexPathInstance không tin rằng chúng ở đó, chỉ cần nhập tiêu đề của lớp xác định chúng vào đầu lớp của bạn và bạn sẽ có thể truy cập một cách kỳ diệu các thuộc tính này.
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
Để sử dụng các thuộc tính này trong lớp của bạn, bạn sẽ phải nhập một thuộc tính mong muốn vào lớp của mình như sau:
@import "UIKit/UITableView.h"
Và sau đó bạn có thể làm những việc như: myIndexPath.row
và[myIndexPath row]
row
được sử dụng bởiUITableView
các hàng; nhữngitem
được sử dụng bởiUICollectionView
các tế bào.