2011-01-12 80 views

回答

12

我已經實現了一些類似於LTKeyPressTableView的東西。但是,我使用數組控制器,所以在我的子類中,我添加了IBOutlet NSArrayController * relatedArrayController。由於我的子類專門處理添加Delete鍵的處理,因此我無需在委託中處理刪除請求,而是直接在子類中處理它。當我檢測到按鍵的刪除鍵時,我只是打電話給[relatedArrayController delete:nil];

IRTableView.h:

#import <Cocoa/Cocoa.h> 

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

@end 

和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 

最終的結果是相當IB友好對我來說,和使用非常簡單的解決方案在Cocoa綁定+核心數據應用。

26

我通常會在應用程序的菜單欄中創建一個新的菜單項。喜歡的東西:

File -> Delete ${Name of Item}

然後你可以在Interface Builder鏈接NSMenuItem指向上或者您的應用程序代理或其他一些地方控制器定義的IBAction爲方法。此方法的實施應從您的模型中刪除該項目,並刷新NSTableView

做出一項NSMenuItem出操作的優點是:

  1. ,您可以給項目在Interface Builder鍵盤快捷鍵。 (像刪除鍵一樣)
  2. 不熟悉應用程序,害怕按下刪除鍵或因任何原因無法訪問鍵盤的用戶仍可以使用此功能。
+1

嗨,克雷格。你的回答不是我真正期望的,但聽起來很不錯! = D非常感謝。 – Leandro 2011-01-13 12:18:09

+2

哈哈是的,起初它似乎是一個非常間接的方法,但它工作得非常好,並照顧了很多頭痛。 – 2011-01-13 12:24:45

9

在10.10之後,NSViewController是應答鏈中的一部分。所以最簡單的方法是在你的子類NSViewController中實現keyDown。

4

沒有必要在NSViewController中繼承並捕獲keyDown

菜單Edit中的Delete菜單項連接到第一響應者的選擇器delete:。如果沒有Delete菜單項,請創建一個並將其連接到First Responder(紅色立方體)的delete:

  • 分配等價鍵Delete菜單項(⌘⌫
  • 在視圖控制器實現IBAction方法

    夫特:@IBAction func delete(_ sender: AnyObject)

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

    並放入刪除表格視圖行的邏輯。