2009-07-14 24 views
6

Tôi có chế độ xem được sử dụng trong mỗi mục trong Bộ sưu tập của tôi. Tôi có một IBOutlet đến CollectionViewItem từ quan điểm của tôi và tôi đã kết nối trong Interface Builder. Tôi muốn truy cập một giá trị từ tệp representObject (là một đối tượng Dữ liệu cốt lõi) trong mã xem của tôi. Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm - truy cập vào một giá trị chuỗi của representedObject:Làm thế nào để lấy được đại diệnObject từ một khung nhìn trong một NSCollectionViewItem?

Trong file .h:

IBOutlet NSCollectionViewItem *item; // Connected in IB 

Trong tập tin .m

NSString *seq = [[item representedObject] valueForKey:@"seq"]; 
NSLog(@"Seq: %@", seq); // returns Seq: (null) 

Tôi biết rằng seq được điền bởi vì tôi đã gắn nó với một nhãn trong khung nhìn CollectionViewItem trong IB bằng cách sử dụng đường dẫn khóa representObject.seq và nó hoạt động.

Bất kỳ ý tưởng nào tại sao khi tôi cố truy cập giá trị cho seq trong mã cho chế độ xem, nó trả về giá trị rỗng?

Trả lời

1

Rất có khả năng NSCollectionViewItem không sao chép qua kết nối IBOutlet từ các chế độ xem của mục đó tới mẫu thử nghiệm NSCollectionViewItem. Do đó, item là không, do đó, seq cũng sẽ là số không.

Mẫu điển hình để truy cập cá thể NSCollectionViewItem là liên kết với mẫu thử nghiệm. Bạn đề cập rằng bạn đã làm điều này và nó hoạt động. Điều đó đơn giản chỉ vì đó là cách hỗ trợ điển hình, được hỗ trợ.

Nếu bạn thực sự cần kết nối trực tiếp đến mục theo cách mà các ràng buộc không thể cung cấp, có thể bạn sẽ phải thiết lập thủ công. Một cách để làm điều này là ghi đè lên số -copyWithZone: của NSCollectionViewItem, gọi siêu, sau đó thực hiện kết nối theo cách thủ công.

+0

Cảm ơn bạn đã thực hiện điều đó. – Austin

+1

Tôi đang bối rối bởi câu trả lời này. Đầu tiên, trạng thái @kperryua "Mẫu điển hình để truy cập cá thể NSCollectionViewItem là liên kết với mẫu thử nghiệm. Bạn đề cập đến việc bạn đã làm điều này và nó hoạt động." Nhưng câu hỏi của Austin chỉ đề cập đến việc sử dụng đường dẫn khóa "representObject.seq" và thực sự rất khó để xem cách một người sẽ liên kết itemPrototype của collectionView với khung nhìn collectionViewItem. Tôi nói điều đó là không thể, nhưng tôi rất vui khi được chứng minh là sai. Thứ hai, tài liệu của Apple cho copyWithZone của NSObject: tuyên bố rõ ràng "Bạn không nên ghi đè phương thức này". –

+0

Ghi đè copyWithZone: khá an toàn miễn là cấp bậc allocWithZone: được gọi bên trong nó. Đã không kiểm tra để xem nếu họ thực sự nói không làm điều đó, nhưng bằng cách nào đó tôi nghĩ rằng bạn có thể có nó nhầm lẫn với allocWithZone: hoặc một số như vậy. – ctpenrose

1

1) phân lớp các NSView được sử dụng để render một mục trong giao diện bộ sưu tập

2) Trong lớp con này, thêm một tài sản đại biểu

3) Sublcass các NSCollectionViewItem

4) Override phương thức setView: Thêm một dòng để đặt thuộc tính ủy nhiệm của khung nhìn cho cá thể NSCollectionViewItem (tức là tự).

Bây giờ, trong lớp con của NSView, bạn sẽ có quyền truy cập vào mục NSCollectionView tương ứng thông qua thuộc tính ủy nhiệm (ví dụ: bạn có thể truy cập vào tệp đại diệnObject).

+0

Phương thức setView sẽ không được dùng nữa (nó được xác định là áp dụng cho 10.5 và 10.6 trong tài liệu của Apple) mặc dù nó được gọi trong 10.7, thời gian này sẽ tiếp tục không được chỉ định. – rougeExciter

0

Tôi đã có cùng một vấn đề, nhưng tìm thấy một giải pháp rất dễ dàng: tôi đặt chế độ xem trong một tệp .xib khác và liên kết trong NSCollectionViewItem (vốn thực sự là NSViewController). Sau đó, .xib sẽ được deserialized cho mỗi tế bào và tất cả các cửa hàng được thiết lập.

0
  1. Phân lớp NSView.
  2. Thêm phương thức ủy quyền để nói phân lớp ... giống như - (void)mouseDownOnItemAtIndex:(NSUInteger)index để thông báo cho người nghe biết rằng người dùng đã nhấp vào một mục tại một chỉ mục cụ thể.
  3. Kéo chế độ xem bộ sưu tập bằng cách sử dụng self.superview trong cùng một lớp. Tạo một biến để lưu trữ NSUInteger. Lưu trữ chỉ mục của mục bằng cách sử dụng phương thức [[collectionView subviews] indexOfObject:self]. Vượt qua chỉ mục đó trong tham số index của phương thức ủy nhiệm.
  4. Lớp học phù hợp với giao thức được xác định trong NSView của bạn giờ đây sẽ có thể nghe thấy từ bất kỳ sự kiện được tổ chức nào tại một ô cụ thể. Nếu bạn muốn đại diệnObject của một mục cụ thể, chỉ cần gọi collectionView:itemAtIndex và nhận mặt hàng bằng cách truy cập mục đó qua thuộc tính representedObject trên NSCollectionViewItem.
Các vấn đề liên quan