NSIndexpath.item so với NSIndexpath.row


82

Có ai biết sự khác biệt giữa NSIndexpath.rowNSIndexpath.item?

Cụ thể, tôi sử dụng cái nào trong:

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

2
có, rowđược sử dụng bởi UITableViewcác hàng; những itemđược sử dụng bởi UICollectionViewcác tế bào.
holex

Câu trả lời:


204

Đượ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.


28
indexPath.row is best in your case 

Thông tin đầu tiên về NSIndexPath

Các NSIndexPathlớ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 nhập mô tả hình ảnh ở đây

Ở đây trong trường hợp của bạn indexPath.rowtrả 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 indexPathhai 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 UICollectionViewfor 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.

Bạn có thể vừa cung cấp liên kết Tham chiếu Lớp NSIndexPath, bạn biết không?
esh

25
Có lẽ, nhưng thường nên đưa các phần có liên quan vào chính câu trả lời. Cho rằng các câu trả lời khác đưa ra câu trả lời quá hẹp, tôi đánh giá cao một người chỉ ra cách sử dụng rộng rãi hơn NSIndexPath.
Rob

6
Tôi vẫn không thấy đề cập đến indexPath.item, trong khi một trong những điều mà câu hỏi được đặt ra là sự khác biệt giữa indexPath.item và indexPath.row. Câu trả lời của Midhun MP làm được điều đó. Tài liệu chỉ sao chép-dán không giúp được nhiều nếu không có một số công phu.
esh

10

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


4

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


0

Nhìn vào cuối UICollectionView.h và bạn sẽ thấy danh mục mở rộng NSIndexPath để thêm itemlà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 rowsectioncá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[myIndexPath row]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.