2013-06-26 32 views
6

Tôi có một NSCollectionView(OS X, không phải iOS) ràng buộc với mô hình của tôi. Mỗi mục trong bộ sưu tập có một nút và một nhãn. Tôi đang xử lý các hành động nhấp và tôi có các đối số senderevent nhưng tôi không thể phân biệt một nút với các nút khác. Hầu hết các câu hỏi khác không liên quan đến Bộ sưu tập Chế độ xem nói để sử dụng thuộc tính tag, nhưng điều này không được hiển thị trên tab ràng buộc của Trình xây dựng giao diện. Có một liên kết ArgumentArgument2 nhưng chúng dường như không tương ứng với thuộc tính tag trong mã objc và tôi không biết cách truy cập các Đối số này bằng cách khác.Cách xử lý một nút bấm từ NSCollectionView

-(void)image_click:(id)sender forEvent:(NSEvent *)event 
{ 
    NSButton *btn = sender; 
    NSLog(@"image clicked, %ld", (long)btn.tag); //image clicked, 0 
} 

Làm cách nào để phân biệt các nút trong mã Objective-C bên trong hành động nhấp của một loạt nút trong chế độ xem bộ sưu tập?

+0

Vui lòng tham khảo câu trả lời này bởi Peter Hosey - http://stackoverflow.com/questions/15468789/get-the-representedobject-values-of-nscollectionviewitem -nsbutton-click –

Trả lời

2

Thêm một mô hình trong dự án của bạn được đặt tên MyModel và kê khai tài sản UniqueID trong MyModel.h

@interface MyModel:NSObject 
@property (retain) NSString* unqiueID; 
@end 

MyModel.m

@implementation MyModel 
@synthesize uniqueID=_uniqueID; 
@end 

Trong AppDelegate.m tạo ra một số đối tượng mô hình và thêm chúng vào một mảng

Trong IB thêm một ArrayController và liên kết nó với mảng khai báo trong AppDelegate

Trong IB chọn CollectionView và ràng buộc sở hữu nội dung của nó để ArrayController và thiết lập thuộc tính ControllerKey của nó để arrangedObjects

Trong bạn Template Xem Sử dụng NSButton của Target và Argument bindings để gửi đối số duy nhất để chọn định

luận cứ của bạn ràng buộc nên trông giống như
Bind to này: Bộ điều khiển Xem mục
mẫu Đường dẫn chính: representedObject.uniqueID
Selector Tên: buttonClicked:

và Target bindings
Bind to: App Đại biểu
Mẫu Đường dẫn chính: tự
Selector Tên: buttonClicked:

Các bước được giải thích một cách chi tiết trong hướng dẫn sau đây
https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CollectionViews/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009030
Hope this helps

+0

Tôi sẽ truy cập các đối số duy nhất trong bộ chọn như thế nào? – Jeff

+1

Bạn nên khai báo bộ chọn trong AppDelegate.m - (void) buttonNhấp vào: (id) đối tượng Nếu bạn thiết lập bindings đúng thì đối tượng sẽ là đối số duy nhất của bạn –

+0

OOOOOH. Điều đó có ý nghĩa. Tôi sẽ cho nó một viên đạn. – Jeff

0

Theo "// hình ảnh này được nhấp, 0" tôi nghĩ bạn đang nhận được 0 cho mỗi lần nhấp nút, tôi có đúng không?

Nếu vậy, bạn có thể có một lối thoát cho các nút trong collectioViewItem và overide - (id) initWithNibName: (NSString *) nibNameOrNil bó: (NSBundle *) nibBundleOrNil để thiết lập/tăng thẻ của mỗi trường hợp của nút .

-1

này sử dụng trong phương pháp cellForItemAtIndexPath

[[cell myButton] addTarget:self action:@selector(myClickEvent:event:) forControlEvents:UIControlEventTouchUpInside]; 


    -(IBAction)myClickEvent:(id)sender event:(id)event { 

      NSSet *touches = [event allTouches]; 

      UITouch *touch = [touches anyObject]; 

      CGPoint currentTouchPosition = [touch locationInView:_myCollectionArray]; 

      NSIndexPath *indexPath = [_myCollectionArray indexPathForItemAtPoint: currentTouchPosition]; 

    } 
2

Tôi giả sử bạn muốn xác định các đối tượng mô hình được đại diện bởi các nút trong giao diện.Tôi đã có thể xác định đối tượng mô hình bằng cách lặp qua các nút trong chế độ xem bộ sưu tập. Tôi không thể sử dụng chỉ mục lựa chọn hoặc bất kỳ thuộc tính tương tự nào khác, nhưng cuối cùng, mô hình có thể được xác định.

Giả sử bạn NSArrayController đã có mảng của bạn, sau đó làm như sau:

Bindings:

Bộ sưu tập Xem chỉ cần một ràng buộc

Bind to:   <NSArrayController instance> 
Controller Key: arrangedObjects 
Model Key Path: <blank> 

Bộ điều khiển:

Bạn nên móc u p bộ điều khiển để xem nội dung

property (weak) IBOutlet NSCollectionView *collectionView; 

Cuối cùng, bộ điều khiển nhận được nút tin nhắn nhấp chuột nên thực hiện IBAction này:

- (IBAction) collectionViewClick:(id)sender 
{ 
    id objectInClickedView = nil; 

    for(int i = 0; i < [[self.collectionView content] count]; i++) { 
    NSCollectionViewItem *viewItem = [self.collectionView itemAtIndex:i]; 

    if([sender isDescendantOf:[viewItem view]]) { 
     objectInClickedView = [[self.collectionView content] objectAtIndex:i]; 
    } 
    } 
} 

Mà sẽ gán các đối tượng để objectInClickedView. Nếu bạn thực sự quan tâm đến chế độ xem hoặc viewItem, bạn có thể sửa đổi mã.

1

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 một phương pháp để mô hình collectionViewItem của bạn (ví dụ buttonClicked)
  2. Bind nút Target vào bộ sưu tập Xem mục
  3. trong khi ràng buộc thiết lập mô hình con đường quan trọng để: representedObject
  4. trong khi ràng buộc bộ selectorname tới: methodname bạn đã chọn trước đó (ví dụ buttonClicked)
  5. 01.
  6. Thêm giao thức để mô hình của bạn, nếu bạn phải nói với ủy
+0

Bạn có mã nào cho điều này không? – Popeye

+0

Điều này đơn giản và trực tiếp hơn so với một số phương pháp được đề xuất khác. Trong mã, bạn xác định đối tượng tùy chỉnh sẽ giữ dữ liệu bạn muốn hiển thị trong chế độ xem bộ sưu tập và cũng sẽ triển khai tác vụ nút bắt buộc, ví dụ: nút - (IBAction)Nhấp vào: (id) người gửi'. Trong bộ dựng giao diện, liên kết nội dung NSCollectionView với một mảng của các đối tượng đó và kết buộc mục tiêu của nút vào CollectionViewItem> representObject> buttonClicked :. – spinacher

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