NSTableView允许用户选择要显示的列

Dav*_*mes 8 macos cocoa objective-c nsmenu nstableview

任何人都知道如何通过右键单击然后选择允许用户选择显示NSTableView的哪些列?就像iTunes一样.

Mil*_*ays 9

我实现了这个,以下应该可以使用,没有任何子类.

首先在IB中实现一个空菜单并连接到表头视图的菜单输出.

此方法(从awakeFromNib调用)从标头构造菜单的内容(并包括一个测试以防止用户隐藏主列)

- (void)initViewHeaderMenu:(id)view {
    //create our contextual menu
    NSMenu *menu = [[view headerView] menu];
    //loop through columns, creating a menu item for each
    for (NSTableColumn *col in [view tableColumns]) {
        if ([[col identifier] isEqualToString:COLUMNID_NAME])
            continue;   // Cannot hide name column
        NSMenuItem *mi = [[NSMenuItem alloc] initWithTitle:[col.headerCell stringValue]
                                                    action:@selector(toggleColumn:)  keyEquivalent:@""];
        mi.target = self;
        mi.representedObject = col;
        [menu addItem:mi];
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

这将调用以下内容来进行实际的隐藏/取消隐藏

- (void)toggleColumn:(id)sender {
    NSTableColumn *col = [sender representedObject];
    [col setHidden:![col isHidden]];
}
Run Code Online (Sandbox Code Playgroud)

您还需要设置菜单的委托并实现以下设置状态: -

#pragma mark NSMenu Delegate Methods
-(void)menuWillOpen:(NSMenu *)menu {
    for (NSMenuItem *mi in menu.itemArray) {
        NSTableColumn *col = [mi representedObject];
        [mi setState:col.isHidden ? NSOffState : NSOnState];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果方法名称不是初始值设定项,则不应以“ init”开头。 (2认同)