NSTableView和退格事件(删除行) - fieldingitor / firstresponder?

时间:2011-02-09 14:35:57

标签: objective-c cocoa nstableview

是否可以让我的NSTableView接受deleteevnt(退格og甚至cmd +退格)?我有一个NSMenu,我的删除菜单项连接到笔尖中的第一个响应者对象。

任何指针?

4 个答案:

答案 0 :(得分:8)

一种易于实施的方法:

  1. 在IB中为您的界面添加+/-按钮并将它们连接到deleteRecord IBAction
  2. 在IB中选择了删除( - )按钮,导航到属性检查器>按钮>关键等价物
  3. 在框中单击以开始录制按键,然后单击“删除/退格键”
  4. 在构建项目时,假设您实现了deleteRecord方法,Backspace按键将从您的tableview中删除记录

答案 1 :(得分:6)

实现此功能的正确方法是使用键绑定:

  1. 选择IB中的删除菜单项,并将其设置为等效于退格键,例如。
  2. 将菜单项操作连接到您为处理任务而编写的方法。当您通过第一响应者连接响应者链时,将自动找到此方法。
  3. 实施删除功能。
  4. 根据您编写的应用程序类型,有验证委托方法。通过这种方式,您可以设置菜单项启用状态。对于基于文档的应用程序,此验证通过- (BOOL)validateUserInterfaceItem:(id)anItem进行。

答案 2 :(得分:5)

这是使用NSViewControllerFirst Responder的现代解决方案。

菜单Delete中的Edit菜单项已连接到First Responder的选择器delete:。如果没有Delete菜单项,请创建一个并将其连接到First Responder的delete:(红色立方体)。

  • 指定等同于Delete菜单项的键(⌘⌫
  • 在视图控制器中实现IBAction方法

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

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

    并输入逻辑以删除表视图行。

不需要子类。

答案 3 :(得分:2)

您可以创建NSTableView的子类,覆盖keyDown,如下所示:

- (void)keyDown:(NSEvent *)theEvent
{

    unichar key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
    if(key == NSDeleteCharacter) 
    {

        [self deleteItem];
        return;
    }

    [super keyDown:theEvent];

}

然后确保您想要具有删除功能的任何NSTableView都使用Interface Builder中的子类而不是常规NSTableView。

您可以实现- (void)deleteItem方法,例如:

- (void)deleteItem
{
    if ([self numberOfSelectedRows] == 0) return;

    NSUInteger index = [self selectedRow];

    [documentController deleteItemWithIndex:index];

}