1

我正在使用 NSBrowser(10.6SDK/Cocoa 应用程序),我想向浏览器列发送一条消息,使其调整其宽度以匹配该列中最大单元格的宽度。

在概念上似乎很基本,即使应该有一种方法,但没有。

这里有人解决过这个问题吗?你是怎么解决的?代码示例?

//更新我添加了drop-support。代码有效,但列中的新项目不适合(有一个椭圆)。

-(BOOL) browser:(NSBrowser *)browser acceptDrop:(id <NSDraggingInfo>)info atRow:(NSInteger)row column:(NSInteger)column dropOperation:(NSBrowserDropOperation)dropOperation
 {
NSPasteboard* pboard = [info draggingPasteboard];
NSData* rowData = [pboard dataForType:CMCourseDataType];
NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];

NSArray *selectedCourses = [[self coursesArrayController] selectedObjects];
Group *selectedGroup = [[self allGroupsArray] objectAtIndex:row];

[selectedGroup addCourses:[NSSet setWithArray:selectedCourses]];
[browser reloadColumn:1];

/* 下面尝试了新代码,以使第 1 列调整其宽度,但它们没有影响 */

[browser sizeToFit];
[[browser matrixInColumn:1] sizeToCells];   

在 awakeFromNib 中,我设置:

[browser setColumnResizingType:NSBrowserUserColumnResizing];

谢谢

4

3 回答 3

0

尝试这个:

NSBrowser *browser; //Browser containing columns
NSInteger index; //Index of column to resize
[[browser matrixInColumn:index] sizeToCells];

或者,如果您想调整整个浏览器的大小,您可以尝试:

[browser sizeToFit];
于 2010-12-19T21:54:21.037 回答
0

我无法找到一个方便的解决方案,但我实现了一个运行良好的系统:

  1. 保留一个可变的列宽数组。
  2. 实现browser:willDisplayCell:atRow:column:委托方法。
  3. 向表中添加新内容时,将新列索引处的列宽数组的值设置为 0。
  4. willDisplayCell调用委托时,计算每个单元格的宽度。对于 NSTextFieldCells,我使用了:CGFloat cellWidth = [((NSTextFieldCell *)cell).attributedStringValue size].width + 40.0f;
  5. 如果计算出的单元格宽度大于存储的列宽,请将存储的值设置为cellWidth并使用新值调用setWidth:forColumn:NSBrowser。
于 2015-01-22T20:07:28.290 回答
0

Swift 3 的更新:

即使这是一个老问题,这个问题仍然是相关的,只是部分回答。上面 Josh 的回答非常好,但我认为没有必要维护额外的列宽数组。我为解决这个问题所做的是:

  1. 向浏览器添加一个操作处理程序:

    browser.action = #selector(BrowserController.selectionChanged)

在 selectionChanged 中,将列宽重置为默认值:

    // don't resize column 0
    for i in 1 ... self.browser.lastVisibleColumn {
        self.browser.setWidth(self.browser.defaultColumnWidth(), ofColumn:i)
    }
  1. 正如 Josh 提到的,实现 browser:willDisplayCell:atRow:column: 方法。在该方法中,将列的大小调整为其中最大的行,并带有一点填充:

        let colWidth = browser.frame(ofColumn: column).size.width //current width
    
        if cell.cellSize.width + 15 > colWidth { //cell is the current cell in the delegate method 
            browser.setWidth(fscell.cellSize.width + 15, ofColumn: column)
        }
    

执行这两项操作将首先重置列,然后将其调整为最大行的大小。

于 2016-11-16T23:57:22.737 回答