gpt4 book ai didi

macos - 使用 NSPopUpButtonCell 时在 NSTableView 中获取重复的标题按钮单元格

转载 作者:行者123 更新时间:2023-12-03 16:20:17 24 4
gpt4 key购买 nike

我有一个动态 NSTableView,它可以根据提供的数据添加许多列。对于每一列,我将标题单元格设置为 NSPopUpButtonCell。 (旁注:我必须为 NSTableHeaderView 使用自定义子类,否则菜单不会弹出)。除了右上角有一个重复或额外的标题按钮单元之外,一切都运行良好。它完美地反射(reflect)了先前的列选择,如屏幕截图所示。我的问题是如何阻止 NSTableView 回收以前的弹出标题单元格? (顺便说一句,我尝试过 setCornerView 方法,但这只影响垂直滚动条上方的标题区域。)

Duplicate column header popupbuttoncell

Duplicate column header popupbuttoncell mirrors the selected value of the previous column

最佳答案

这周我遇到了同样的问题。我采用了快速修复方法,

[_tableView sizeLastColumnToFit];

(但是,在与 OP 讨论后,这要求您在 header 中使用 NSPopUpButtonCell 的子类以及 NSTableHeaderView。我在下面附上我的解决方案)

您可以通过结合此处概述的方法来实现此目的,

  1. PopUpTableHeaderCell
  2. DataTableHeaderView

这是一个简化的代码片段,

// PopUpTableHeaderCell.h
#import <Cocoa/Cocoa.h>
/* Credit: http://www.cocoabuilder.com/archive/cocoa/133285-placing-controls-inside-table-header-view-solution.html#133285 */

@interface PopUpTableHeaderCell : NSPopUpButtonCell
@property (strong) NSTableHeaderCell *tableHeaderCell; // Just used for drawing the background

@end

// PopUpTableHeaderCell.m
@implementation PopUpTableHeaderCell

- (id)init {
if (self = [super init]){

// Init our table header cell and set a blank title, ready for drawing
_tableHeaderCell = [[NSTableHeaderCell alloc] init];
[_tableHeaderCell setTitle:@""];

// Set up the popup cell attributes
[self setControlSize:NSMiniControlSize];
[self setArrowPosition:NSPopUpNoArrow];
[self setBordered:NO];
[self setBezeled:NO];
[self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
}
return self;
}

// We do all drawing ourselves to make our popup cell look like a header cell
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView{

[_tableHeaderCell drawWithFrame:cellFrame inView:controlView];

// Now draw the text and image over the top
[self drawInteriorWithFrame:cellFrame inView:controlView];
}

@end

现在介绍 NSTableViewHeader 子类。

//DataTableHeaderView.h
#import <Cocoa/Cocoa.h>

/* Credit: http://forums.macnn.com/79/developer-center/304072/problem-of-nspopupbuttoncell-within-nstableheaderview/ */

@interface DataTableHeaderView : NSTableHeaderView
@end

//DataTableHeaderView.m
#import "DataTableHeaderView.h"

/* Credit: http://forums.macnn.com/79/developer-center/304072/problem-of-nspopupbuttoncell-within-nstableheaderview/ */

@implementation DataTableHeaderView

- (id)initWithFrame:(NSRect)frame {

self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}

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

// Figure which column, if any, was clicked
NSPoint clickedPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSInteger columnIndex = [self columnAtPoint:clickedPoint];
if (columnIndex < 0) {
return [super mouseDown:theEvent];
}

NSRect columnRect = [self headerRectOfColumn:columnIndex];

// I want to preserve column resizing. If you do not, remove this
if (![self mouse:clickedPoint inRect:NSInsetRect(columnRect, 3, 0)]) {
return [super mouseDown:theEvent];
}

// Now, pop the cell's menu
[[[self.tableView.tableColumns objectAtIndex:columnIndex] headerCell] performClickWithFrame:columnRect inView:self];
[self setNeedsDisplay:YES];
}

- (BOOL)isOpaque {
return NO;
}


- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
}

@end

您可以将 AppDelegate -awakeFromNib 或类似的所有内容绑定(bind)在一起,

-(void) awakeFromNib {

/* NB the NSTableHeaderView class is changed to be an DataTableHeaderView in IB! */

NSUInteger numberOfColumnsWanted = 5;
for (NSUInteger i=0; i<numberOfColumnsWanted; i++) {

PopUpTableHeaderCell *headerCell;
headerCell = [[PopUpTableHeaderCell alloc] init];

[headerCell addItemWithTitle:@"item 1"];
[headerCell addItemWithTitle:@"item 2"];
[headerCell addItemWithTitle:@"item 3"];

NSTableColumn *column;
[column setHeaderCell:headerCell];
[column sizeToFit];

[_tableView addTableColumn:column];
}

/* If we don't do this we get a final (space filling) column with an unclickable (dummy) header */
[_tableView sizeLastColumnToFit];

}

除此之外,我还没有弄清楚如何正确纠正该区域的绘图。

似乎是正在复制的最后一个单元格的图像。因此,我稍微更黑客的方法是在 TableView 中添加一个带有空白名称的额外列,并故意忽略鼠标点击。希望通过设置最后一列的显示属性,您可以使其看起来像您想要的那样。

我找不到任何允许控制该区域的 NSTableView 或 NSTableViewDelegate 方法,因此可能任何其他解决方案都会非常复杂。我也对一个好的解决方案感兴趣,但我希望这能让您开始!

关于macos - 使用 NSPopUpButtonCell 时在 NSTableView 中获取重复的标题按钮单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com