2011-01-12 84 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

    并放入删除表格视图行的逻辑。