NSTableView +删除密钥

Lea*_*dro 10 cocoa key objective-c nstableview

我正在寻找一个简单的解决方案,通过按下删除键删除NSTableView行.我在谷歌搜索时看到的就是这样的答案:http://likethought.com/lockfocus/2008/04/a-slightly-improved-nstableview/.这在我看来是一个工程解决方案,但我想知道这是否是最好的方法.有人知道更好的答案吗?

Cra*_*tis 26

我通常做的是在应用程序的菜单栏中创建一个新菜单项.就像是:

File -> Delete ${Name of Item}

然后,您可以NSMenuItem在Interface Builder中将其链接到指向在您的应用程序委托或某个其他控制器上某处定义的IBAction方法.此方法的实现应从模型中删除该项,然后刷新NSTableView.

NSMenuItem摆脱行动的好处是:

  1. 您可以在Interface Builder中为项目提供键盘快捷方式.(与删除键一样.)
  2. 不熟悉您的应用程序,不敢按删除键或无论出于何种原因无法访问键盘的用户仍然可以使用此功能.

  • 哈哈,起初它似乎是一个非常间接的方法,但它的效果非常好,并且需要处理很多麻烦. (2认同)

Iva*_*ica 12

我已经实现了类似的东西LTKeyPressTableView.但是,我使用数组控制器,所以在我的子类中我添加了IBOutlet NSArrayController * relatedArrayController.我没有在委托中处理删除请求,而是直接在子类中处理它,因为我的子类专门处理添加Delete键的处理.当我检测到按键的按键时,我只是打电话[relatedArrayController delete:nil];.

IRTableView.h:

#import <Cocoa/Cocoa.h>

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

@end
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

最终结果对我来说非常友好,并且是一个非常简单的解决方案,可用于Cocoa Bindings + Core Data应用程序.


Tia*_*hou 10

10.10之后,NSViewController是响应者链的一部分.因此,最简单的方法是在子类NSViewController中实现keyDown


vad*_*ian 8

有没有需要继承和捕捉keyDownNSViewController.

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

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

    迅速: @IBAction func delete(_ sender: AnyObject)

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

    并输入逻辑删除表视图行.