Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用NSPopUpButtonCell时在NSTableView中获取重复的标题按钮单元格_Macos_Cocoa_Nstableview_Nspopupbuttoncell - Fatal编程技术网

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

Macos 使用NSPopUpButtonCell时在NSTableView中获取重复的标题按钮单元格,macos,cocoa,nstableview,nspopupbuttoncell,Macos,Cocoa,Nstableview,Nspopupbuttoncell,我有一个动态NSTableView,它可以根据提供的数据添加许多列。对于每一列,我都将标题单元格设置为NSPopUpButtonCell。(旁注:我必须为NSTableHeaderView使用自定义子类,否则菜单不会弹出)。除了右上角的重复或额外页眉按钮单元格外,所有操作都很好。它完美地反映了屏幕截图中显示的上一列选择。我的问题是如何阻止NSTableView循环使用以前的弹出标题单元格?(顺便说一句,我已经尝试过setCornerView方法,但这只会影响垂直滚动条上方的标题区域。) 本周我

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


本周我遇到了同样的问题。我用了快速修复

[_tableView sizeLastColumnToFit];
(但是,在与OP讨论后,这要求您在标头中使用NSPopUpButtonCell的子类,并在NSTableHeaderView中使用。我在下面附上我的解决方案)

您可以通过结合此处概述的方法来实现这一点

  • 这是一个简化的片段

    // 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
    
    除此之外,我还没有弄明白如何正确地纠正该区域的图形

    似乎是最后一个细胞的图像被复制了。因此,我稍微有点粗俗的做法是在表视图中添加一个额外的列,其名称为空,并且故意忽略鼠标单击。希望通过设置最后一列的显示属性,您可以使它看起来像您想要的那样


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

    我有这个问题,我根本不使用NSPopUpButtonCell。 我只想告诉大家如何隐藏这个奇怪的标题的其他方法。此方法不会删除奇数表列,即,如果您有2个“合法”列并隐藏此额外的第3列标题,您仍然可以在第2列和第3列之间移动分隔符。但在这种情况下,即使要调整任何列的大小,也不会看到冗余的标题。 我仍然需要解决方案如何完全删除冗余列,以及为什么会发生这种情况。(为什么苹果不修复这个漏洞?)

    所以。。。您可以只计算该标题所属列的索引,并根据该索引绘制标题或不标题。首先,子类
    NSTableHeaderCell
    ,并将其设置为列的单元格类。假设您的子类名为
    TableHeaderCell

    for column in self.tableView.tableColumns {
        let col:NSTableColumn = column as! NSTableColumn
        //you can operate with header cells even for view-based tableView's 
        //although the documentation says otherwise.
        col.headerCell = TableHeaderCell(textCell: col.title) 
        //or what initialiser you will have
    }
    
    然后在TableHeaderCell的
    drawWithFrame
    方法中,您应该具备:

    override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) {
        let headerView = controlView as! HashTableHeaderView
        let columnIndex = headerView.columnAtPoint(cellFrame.origin)
        if columnIndex == -1 {
            return
        }
    
        //parent's drawWithFrame or your own draw logic:
        super.drawWithFrame(cellFrame, inView: controlView)
    }
    

    在此之后,您将不会绘制多余的标题,因为它不属于任何列,
    columnAtPoint
    方法将返回-1。

    我已将其缩小为导致问题的nspoupbuttoncell。如果我使用标准的NSTableHeaderCell,SizeLastColumntOffit方法可以工作,但如果我改用NSPopUpButtonCell,它将无法工作。不确定是否有解决方法?非常详细的答案解决了这个问题。尽管有一点需要注意:-默认情况下,用户可以调整列的大小,如果他们向内调整最后一列的大小,他们当然会显示重复的标题单元格。为了避免这种情况,我建议设置[tableView setAllowsColumnResizing:NO];你知道是什么导致了这个错误吗?
    for column in self.tableView.tableColumns {
        let col:NSTableColumn = column as! NSTableColumn
        //you can operate with header cells even for view-based tableView's 
        //although the documentation says otherwise.
        col.headerCell = TableHeaderCell(textCell: col.title) 
        //or what initialiser you will have
    }
    
    override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) {
        let headerView = controlView as! HashTableHeaderView
        let columnIndex = headerView.columnAtPoint(cellFrame.origin)
        if columnIndex == -1 {
            return
        }
    
        //parent's drawWithFrame or your own draw logic:
        super.drawWithFrame(cellFrame, inView: controlView)
    }