2011-01-12 42 views
9

Tôi đang tìm một giải pháp dễ dàng để xóa các hàng NSTableView bằng cách nhấn phím xóa. Tất cả những gì tôi đã thấy khi tìm kiếm trong Google là các câu trả lời như thế này: http://likethought.com/lockfocus/2008/04/a-slightly-improved-nstableview/. Điều này dường như với tôi một giải pháp kỹ thuật, nhưng tôi muốn biết nếu đây là cách tốt nhất. Có ai biết câu trả lời hay hơn không?NSTableView + Xóa khóa

Trả lời

12

Tôi đã triển khai một cái gì đó tương tự như LTKeyPressTableView. Tuy nhiên, tôi sử dụng bộ điều khiển mảng, vì vậy trong phân lớp của tôi, tôi đã thêm IBOutlet NSArrayController * relatedArrayController. Thay vì xử lý yêu cầu xóa trong một đại biểu, tôi xử lý nó trực tiếp trong phân lớp vì lớp con của tôi đặc biệt đề cập đến việc thêm xử lý khóa Delete. Khi tôi phát hiện phím bấm để xóa, tôi chỉ cần gọi [relatedArrayController delete:nil];.

IRTableView.h:

#import <Cocoa/Cocoa.h> 

@interface IRTableView : NSTableView { 
    IBOutlet NSArrayController * relatedArrayController; 
} 

@end 

và IRTableView.m:

#import "IRTableView.h" 


@implementation IRTableView 


- (void)keyDown:(NSEvent *)event 
{ 
    // Based on LTKeyPressTableView. 
    //https://github.com/jacobx/thoughtkit/blob/master/LTKeyPressTableView 

    id delegate = [self delegate]; 

    // (removed unused LTKeyPressTableView code) 

    unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0]; 
    if(key == NSDeleteCharacter) 
    { 
     if([self selectedRow] == -1) 
     { 
      NSBeep(); 
     } 

     BOOL isEditing = ([[self.window firstResponder] isKindOfClass:[NSText class]] && 
          [[[self.window firstResponder] delegate] isKindOfClass:[IRTableView class]]); 
     if (!isEditing) 
     { 
      [relatedArrayController remove:nil]; 
      return; 
     } 

    } 

    // still here? 
    [super keyDown:event]; 
} 

@end 

Kết quả cuối cùng là khá IB thân thiện đối với tôi, và một giải pháp khá đơn giản để sử dụng trong một Cocoa Bindings + Lõi Ứng dụng dữ liệu.

26

Điều tôi thường làm là tạo một mục menu mới trong thanh menu của ứng dụng. Một cái gì đó như:

File -> Delete ${Name of Item}

Sau đó, bạn có thể liên kết mà NSMenuItem trong Interface Builder để trỏ đến một phương pháp IBAction định nghĩa ở đâu đó trên một trong hai đại biểu ứng dụng của bạn hoặc một số điều khiển khác. Việc triển khai phương pháp này sẽ xóa mục khỏi mô hình của bạn và làm mới NSTableView.

Ưu điểm để làm cho một NSMenuItem ra khỏi hành động là:

  1. Bạn có thể cung cấp cho các mục phím tắt trong giao diện Builder. (Giống như phím xóa.)
  2. Người dùng không quen với ứng dụng của bạn, ngại nhấn phím xóa hoặc không có quyền truy cập bàn phím vì bất kỳ lý do nào, vẫn có thể sử dụng chức năng này.
+1

Xin chào, Craig. Câu trả lời của bạn không phải là những gì tôi đã thực sự mong đợi, nhưng nó có vẻ khá tốt! = D Cảm ơn bạn rất nhiều. – Leandro

+2

Haha yea, lúc đầu nó có vẻ giống như một cách tiếp cận khá gián tiếp, nhưng nó hoạt động rất tốt, và chăm sóc rất nhiều nhức đầu. –

+0

trừ khi bạn có hai chế độ xem bảng ... – peetonn

9

Sau 10.10, NSViewController là một phần của chuỗi phản hồi. Vì vậy, cách dễ nhất là triển khai keyDown trong NSViewController được phân lớp của bạn

+1

Điểm tốt về việc sử dụng chuỗi trả lời để tránh phân lớp phụ (nếu có thể). –

4

Không cần phải phân lớp và bắt giữ keyDown trong NSViewController.

Mục menu Delete trong menu Edit được kết nối với công cụ chọn delete: của Responder đầu tiên. Nếu không có mục menu Delete, hãy tạo một mục và kết nối nó với delete: của Trình trả lời đầu tiên (khối màu đỏ).

  • Gán một tương đương chìa khóa dẫn đến mục Delete menu ( hay ⌘⌫)
  • Trong điều khiển xem thực hiện các phương pháp IBAction

    Swift: @IBAction func delete(_ sender: AnyObject)

    Objective- C: -(IBAction)delete:(id)sender

    và đặt vào logic để xóa (các) hàng xem bảng.

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