7

Tôi đã phát triển một ứng dụng cho Mac OS X Lion bằng cách sử dụng NSTableView dựa trên chế độ xem mới của nó, nhưng khi tôi muốn chuyển toàn bộ ứng dụng sang Snow Leopard, tôi đang cố gắng tìm ra cách tốt nhất để mô phỏng như vậy. Cho đến nay tôi đã tạo một NSCollectionView và mọi thứ đều ổn, ngoại trừ thực tế là tôi không thể lấy chỉ mục của khung nhìn mà từ đó một sự kiện nhấn nút được kích hoạt. Trong Lion tôi có chức năng sau:Nhận chỉ mục của một khung nhìn bên trong một NSCollectionView?

- (IBAction)buttonClick:(id)sender 

vì vậy tôi có thể nhận được các chỉ số quan điểm bên trong tableview sử dụng một phương pháp (Tôi không thể nhớ tên của nó) như

- (NSInteger)rowForView:(NSView *)aView 

với Aview là superView của người gửi, nhưng tôi không thể tìm thấy một cái gì đó tương tự cho xem bộ sưu tập ... các chỉ phương pháp "hữu ích" có vẻ là

- (NSCollectionViewItem *)itemAtIndex:(NSUInteger)index 

(hoặc một cái gì đó như thế này), nhưng điều này không thể giúp tôi vì nó trả về một NSCollectionViewItem và tôi thậm chí không thể truy cập nó chỉ biết quan điểm tương ứng!

Trả lời

4

Trong buttonClick, hãy thử mã này:

id collectionViewItem = [sender superview]; 
NSInteger index = [[collectionView subviews] indexOfObject:collectionViewItem]; 
return index; 

Hope this helps :)

+1

Tôi không thể tin được, có vẻ như nó hoạt động! Tôi không chắc chắn đây là tốt nhất là để đạt được điều này (Apple nên đã thực hiện một phương pháp tốt hơn) nhưng dù sao này giải quyết vấn đề của tôi. Cảm ơn bạn rất nhiều! – Nickkk

+1

Cảnh báo: điều này không hoạt động nữa khi các mục xem được sắp xếp lại (ví dụ: nếu bạn hỗ trợ sắp xếp lại bằng cách kéo và thả). – Mark

1

Làm thế nào về một cái gì đó như:

id obj = [collectonViewItem representedObject]; 
NSInteger index = [[collectionView contents] indexOfObject:obj]; 
+0

Như tôi đã nói, tôi không thể truy cập collectonViewItem chỉ biết chế độ xem đại diện cho nó ... – Nickkk

2

Geesh! Cả hai cách tiếp cận này đều có vấn đề. Tôi có thể thấy làm thế nào đầu tiên trên có thể làm việc, nhưng lưu ý rằng "collectionViewItem" thực sự là xem, không phải là collectionViewItem, mà là một bộ điều khiển xem.

Cách thứ hai sẽ không hoạt động, trừ khi bạn phân lớp nút và đặt trong liên kết ngược đến collectionViewItem. Nếu không, quan điểm của bạn không biết collectionViewItem điều khiển nó là gì. Bạn nên sử dụng một bộ chọn liên kết với collectionOItject của collectionViewItem thay vào đó, để có được hành động cho đối tượng chính xác trong mảng của bạn.

0

Như tôi đã đề nghị ở đây: How to handle a button click from NSCollectionView

tôi sẽ làm điều đó như thế này (vì nút bạn muốn nhấn nên được kết hợp với các mô hình tương ứng, do đó các đối tượng đại diện):

  1. Thêm phương thức cho mô hình của collectionViewItem của bạn (ví dụ: buttonClicked)
  2. Liên kết mục tiêu nút với bộ sưu tập Xem mục
  3. Khi liên kết đặt đường dẫn mô hình thành: representObject
  4. Mặc dù tên bộ chọn liên kết thành: tên phương thức bạn đã chọn trước đó (ví dụ: buttonClicked)
  5. Thêm giao thức để mô hình của bạn, nếu bạn phải nói với đại biểu hoặc thiết lập quan sát-pattern
0
  1. sử dụng NSArrayController cho ràng buộc để NSCollectionView,

  2. sử dụng collectonViewItem.representedObject để có được một Tuỳ chỉnh Mô hình được xác định bởi chính bạn.

  3. lưu và nhận chỉ mục trong mô hình tùy chỉnh của bạn.

Điều đó phù hợp với tôi.

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