2013-02-08 19 views
51

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

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

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

có, hàng 'được sử dụng bởi hàng' UITableView'; 'mục' được sử dụng bởi các ô' UICollectionView'. – holex

Trả lời

122

Được rồi, ai đã đưa ra một câu trả lời tốt ở đâ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. Phần "access" là một bí danh cho "_indexes [0]" và cả "item" và "row" là các bí danh cho "_indexes [1]". Vì vậy, hai chức năng giống hệt nhau.

Về mặt kiểu lập trình - và có lẽ là chuỗi định nghĩa - bạn nên sử dụng "hàng" trong ngữ cảnh của bảng và "mục" trong ngữ cảnh của bộ sưu tập.

+18

Tuyệt vời! Vì vậy, thực sự không có sự khác biệt nào. – fatuhoku

+0

Tôi thích câu trả lời đơn giản hơn là giải thích cách hoạt động và v.v. Làm tốt công việc – Codenator81

+0

Làm thế nào mọi người biết rất nhiều về điều này thổi tâm trí của tôi, chỉ là câu trả lời tôi đã tìm kiếm mặc dù! cám ơn rất nhiều! – Dan

9

Bạn cần phải sử dụng indexPath.row

Sự khác biệt là:

indexPath.row là dành cho tableView và indexPath.item là dành cho collectionView.

mục

Một số chỉ số xác định một mục trong một phần của một cái nhìn bộ sưu tập. (read-only) @property (nonatomic, readonly) NSInteger item;

Thảo luận

Phần mục là ở được xác định bởi giá trị của phần. Availability

Available in iOS 6.0 and later. 

khai báo trong UICollectionView.h


hàng

Một số chỉ số xác định một hàng trong một phần của một cái nhìn bảng. (read-only) @property(nonatomic, readonly) NSInteger row;

Thảo luận

Phần hàng là ở được xác định bởi giá trị của phần. Availability

Available in iOS 2.0 and later. 

Vui lòng kiểm tra NSIndexPath Additions để biết chi tiết

+2

Điều gì sẽ xảy ra khi bạn truy cập 'hàng' từ' UICollectionView {Delegate, DataSource} 'hoặc nếu bạn truy cập' mục' từ 'UITableView {Delegate, DataSource}'? – fatuhoku

+0

Bạn nhận được một sự vi phạm truy cập hoặc tồi tệ hơn – iosengineer

+5

nó sẽ vẫn hoạt động – Lirik

25
indexPath.row is best in your case 

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

Lớp NSIndexPath đại diện cho đường dẫn đến một nút cụ thể trong một cây của mảng lồng nhau bộ sưu tập. Đường dẫn này được gọi là đường dẫn chỉ mục.

Mỗi chỉ mục trong indexPath biểu thị chỉ mục thành một mảng trẻ em từ một nút trong cây đến nút khác, nút sâu hơn.

Ví dụ, chỉ mục 1.4.3.2 xác định con đường thể hiện trong hình enter image description here

đây trong trường hợp của bạn indexPath.row trả về chỉ số của hàng tại cụ thể indexPath.

Sự khác nhau giữaindexPath.row and indexPath.item

chung indexPathhai thuộc tính

1 - hàng

2 - mục

hàng - sử dụng thuộc tính với UITableView để nhận cụ thể hàng cơ sở trên indexPath. nó cũng được chỉ đọc tài sản

Available in iOS 2.0 and later. 

mục - đúng cách sử dụng với UICollectionView cho được mục trong phần. Đây là tài sản chỉ đọc. Để sử dụng tài sản này, bạn cần phải khai báo nó trong
UICollectionView.h

>  Available in iOS 6.0 and later. 
+0

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

+19

Có lẽ, nhưng thường được khuyên nên bao gồm các phần liên quan trong chính câu trả lời. Cho rằng các câu trả lời khác cho quá hẹp của một câu trả lời, tôi đánh giá cao một người chỉ ra việc sử dụng rộng hơn của 'NSIndexPath'. – Rob

+4

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

1

@Owen Câu trả lời của Godfrey tốt hơn câu trả lời được chấp nhận từ @iPatel. Dưới đây là một số làm rõ thêm mà tôi đã không thể phù hợp với một bình luận về câu trả lời của mình, vì vậy tôi sẽ sao chép câu trả lời của mình và thêm vào nó ở đây. Tín dụng thuộc về Owen.


Từ @Owen Godfrey:

Bên NSIndexPath, các chỉ số được lưu trữ trong một mảng c đơn giản gọi là "_indexes" định nghĩa là NSUInteger * và độ dài của mảng được lưu trữ trong "_length" được định nghĩa là NSUInteger. Phần "access" là một bí danh cho "_indexes [0]" và cả "item" và "row" là các bí danh thành "_indexes 1". Vì vậy, hai chức năng giống hệt nhau.

Về mặt kiểu lập trình - và có lẽ là chuỗi định nghĩa - bạn nên sử dụng "hàng" trong ngữ cảnh của bảng và "mục" trong ngữ cảnh của bộ sưu tập.


Giao diện lõi của NSIndexPath được định nghĩa trong NSIndexPath.h. Việc lưu trữ các chỉ mục nằm trong _indexes, đó là mảng một chiều riêng của NSUInteger. Bản thân NSIndexPath có thể đại diện cho bất kỳ số thứ nguyên nào. Có hai loại 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 có liên quan. Một từ UITableView.h thêm thuộc tính "hàng" thuộc tính chỉ đọc và các phương thức tiện lợi có 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 loại, 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 IOS ở đâu. 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 là giống nhau cho dù được truy cập bởi indexPath.item hoặc indexPath.row.

Phong cách sẽ sạch hơn nếu bạn sử dụng "mục" với UICollectionView và "hàng" với UITableView vì đó là cách chúng được 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 sụp đổ nếu bạn trao đổi chúng.

tham khảo: NSIndexPath

0

Nhìn ở dưới cùng của UICollectionView.h và bạn sẽ thấy những loại kéo dài NSIndexPath thêm item như một tài sản khi được sử dụng trong phạm vi cho các trường hợp UICollectionView.

Có một phần tương tự ở dưới cùng của UITableView.h thêm rowsection thuộc tính cho NSIndexPaths đượ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 thể hiện 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 học của bạn và bạn sẽ kỳ diệu có thể truy cập 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 trong lớp học của bạn, bạn sẽ phải nhập khẩu mong muốn một vào lớp học của bạn như sau:

@import "UIKit/UITableView.h"

Và sau đó bạn có thể làm những việc bạn thích e: myIndexPath.row[myIndexPath row]

Các vấn đề liên quan