2009-03-06 30 views
62

Tôi cần ứng dụng của mình để mở cửa sổ khi người dùng nhấp đúp vào một hàng trong một NSTableView. Tôi đang gặp một chút khó khăn trong việc tìm kiếm thông tin hoặc các ví dụ về cách thực hiện điều này. Ai đó có thể chỉ cho tôi phương hướng đúng không?Nhấp đúp chuột vào hàng NSTableView trong Cocoa?

Trả lời

117

Hãy xem phương thức -setDoubleAction: trên NSTableView; bạn có thể đặt nó thành một phương thức sẽ được gọi giống như hệ thống hành động mục tiêu bình thường nhưng trên một cú đúp.

Trong phương thức hành động đó, -clickedRow sẽ hữu ích.

+7

Có cách nào để kết nối thông qua IB? –

+21

Cũng nhớ đặt mục tiêu cho chế độ xem bảng bằng setTarget :, ngớ ngẩn nhưng có thể bị bỏ qua – nduplessis

+1

Nếu bạn triển khai -setDoubleAction: làm phương thức ủy nhiệm hoặc bạn nên tạo IBOutlet iVar cho bảng và gọi -setDoubleAction: trên iVar? –

55

Thêm thông tin cơ bản khác vào @JimPuls trả lời vì lợi ích của những người mới đến Cocoa.

  1. IBOutlet cho NSTableView cần được khai báo trong giao diện. Tôi cho rằng nó được ưu tiên làm như vậy trong ủy nhiệm của bảng.
  2. IBOutlet cho bảng cần được kết nối thông qua Trình tạo giao diện. Để thực hiện điều đó, hãy nhấn Ctrl-Drag & Thả vào IB từ lớp khai báo ổ cắm đó sang chế độ xem bảng. Khi bạn nhả chuột, cửa sổ bật lên sẽ xuất hiện với tên của cửa hàng bạn đã khai báo ở bướC# 1. Chọn nó.
  3. Trong phần @implementation, trên phương thức -awakeFromNib, call -setTarget: và -setDoubleAction: trên IBOutlet được khai báo ở bướC# 1 và được kết nối ở bướC# 2.

Đây là trích đoạn từ đại biểu xem bảng của tôi. Tôi có đại biểu của tôi cũng thiết lập như là nguồn dữ liệu, vì vậy đó là lý do tại sao bạn sẽ thấy cả hai giao diện NSTableViewDelegate và NSTabeViewDataSource liên kết với nó.

// Đoạn trích giao diện.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource> 
{ 
    // This iVar needs to be connected to the table view via the IB. 
    IBOutlet NSTableView *tableOutlet; 
} 

@property (assign) IBOutlet NSTableView *tableOutlet; 

- (void)doubleClick:(id)nid; 

@end 

// Trích đoạn triển khai.

@implementation MyTableViewDelegate 

@synthesize tableOutlet = _tableOutlet; 

- (void)awakeFromNib { 
    [_tableOutlet setTarget:self]; 
    [_tableOutlet setDoubleAction:@selector(doubleClick:)]; 
} 

- (void)doubleClick:(id)object { 
    // This gets called after following steps 1-3. 
    NSInteger rowNumber = [_tableOutlet clickedRow]; 
    // Do something... 
} 

Hy vọng điều này sẽ hữu ích.

0

Bạn có thể làm điều tương tự với các ràng buộc, trước hết là tuyên bố một mentod trong file .h

-(IBAction)openWindow:(id)sender 

trong file .m thực hiện cùng

-(IBAction)openWindow:(id)sender 
{ 
    //do something here; 
} 

phải nib rằng nơi bạn xem bảng hiện tại, chọn xem bảng và nhận tab cuối cùng thứ hai của thanh tra thuộc tính, mở liên kết kiểm tra đối số để kiểm tra xem chủ sở hữu tập tin, mô hình khóa chính phải là "tự", tên bộ chọn sẽ là "openWindow: ", cùng một quá trình thực hiện với" mục tiêu nhấp đúp "tiết lộ re, Thao tác này sẽ hoạt động

10

Như PR Singh đã nói, bạn có thể sử dụng kết buộc cacao, bạn cũng có thể chuyển qua các selectedObject.

  1. Chọn bảng Xem ở của bạn trong IB sau đó trong Bindings thanh tra đặt hai bindings này như sau:

    >Double Click Target 
    
    bind to = Application delegate object (or file owner) 
    model key path = self 
    selector name = myMethod: 
    
    >Double Click Argument 
    
    bind to = array controller 
    controller key = selectedObjects 
    selector name = myMethod: 
    

đâu myMethod được thực hiện như

- (void)myMethod:(NSArray*)selectedObjects 
     { 
     NSLog(@"%@", selectedObjects); 
     } 

Đây cũng là được ghi lại ở đây: https://developer.apple.com/library/mac/qa/qa1472/_index.html

+0

Làm việc như một sự quyến rũ. – groomsy

6

Nếu ai đó tìm kiếm một phiên bản 2.0 nhanh chóng: Đây là những gì phù hợp với tôi. Có vẻ dễ hơn nhiều so với mã C Mục tiêu.

@IBOutlet weak var searchResultTable: NSTableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    searchResultTable.doubleAction = "doubleClickOnResultRow" 
} 

func doubleClickOnResultRow() 
{ 
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)") 
} 
+0

Điều này thực sự hữu ích. Đối với những người muốn biết thêm về 'doubleAction', hãy xem [link] này (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/index.html#//apple_ref/occ/instp/NSTableView/doubleAction). –

+0

Đối với Swift 3, bộ chọn chức năng sẽ là 'searchResultTable.doubleAction = #selector (doubleClickOnResultRow)' –

6

Bạn có thể kết nối hành động nhấp đúp trong Trình tạo giao diện. Kiểm soát nhấp vào chế độ xem bảng của bạn (đảm bảo rằng bạn đang xem chế độ xem bảng , không phải chế độ xem cuộn hoặc chế độ xem clip hoặc cột bảng) để có bảng điều khiển kết nối. Tìm mục “doubleAction” trong phần “Tác vụ đã gửi”. Kết nối nó với IBAction mà bạn chọn.

+0

Dễ dàng vuốt ve chanh. Bạn có thể nhận hàng được nhấp từ phương thức clicksRow của chế độ xem bảng. Bạn vẫn cần ổ cắm được mô tả trong câu trả lời số hai. –

+0

Bạn không nhất thiết cần một ổ cắm được kết nối với chế độ xem bảng, vì chế độ xem bảng cung cấp chính nó làm đối số người gửi của thông báo hành động. –

+0

Ước gì tôi đã nhìn thấy điều này trước khi đào sâu vào công cụ nhận dạng cử chỉ của chính tôi ... – ghostatron

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