NSBrowser图像未在单元格中显示

时间:2015-08-03 08:45:25

标签: cocoa osx-yosemite nsbrowser

我正在使用NSBrowser视图显示finder类型app中的文件和文件夹列表。我正在使用NSBrowser的新Item Base Api。

问题在于,当我尝试在public function newProductsAction(Request $request) { $em = $this->getDoctrine()->getManager(); $products = $em->getRepository('MpShopBundle:Product')->findBy(array('status' => 1), array('id' => 'ASC'), 15); $locale = $this->get('translator')->getLocale(); $session = $this->getRequest()->getSession(); $cart = $session->get('cart', array()); $skin = $em->getRepository('MpShopBundle:Skin')->findOneBy(array('status' => 1)); $paginator = $this->get('knp_paginator'); $pagination = $paginator->paginate( $products, $request->query->getInt('page', 1)/*page number*/, 9/*limit per page*/ ); 方法中设置图像时。视图中不显示任何内容。

代码:

willDisplayCell

Apple SimpleCocoaBrowser Example

2 个答案:

答案 0 :(得分:1)

当cellPrototype的默认值为 NSBrowserCell 时,它似乎使用了 NSTextFieldCell 。 (macOS 10.14)

要解决此问题,您需要将 NSBrowserCell 子类化,并将子类设置为 cellClass [_browser setCellClass:[BrowserCell class]];

@interface BrowserCell : NSBrowserCell
@end

@implementation BrowserCell
@end

另一个问题是叶子指示器。它将显示两次,一次从单元格显示,一次从浏览器显示。

- (void)browser:(NSBrowser *)browser willDisplayCell:(NSBrowserCell *)cell atRow:(NSInteger)row column:(NSInteger)column {
    FileSystemNode *parentNode = [self parentNodeForColumn:column];
    FileSystemNode *childNode = [parentNode.children objectAtIndex:row];

    NSImage *image = node.icon;
    [image setSize:NSMakeSize(16, 16)];

    cell.image = cell.image;
    cell.leaf = YES;
}

radar:// 47175910

答案 1 :(得分:0)

使用catlan答案中描述的NSBrowserCell可以工作,但是在绘制选定单元格的背景时,NSTextField的行为与NSBrowserCell有所不同。当鼠标在另一列中单击/拖动时,NSBrowserCell将绘制所选单元格的背景,而背景是蓝色,而灰色(而不是Finder也会这样做)。但是,单击鼠标时NSTextFieldCell保持蓝色,释放时变为灰色。由于叶子指示符不是由NSBrowserCell绘制的,因此该单元格的该区域仍将具有蓝色的选择突出显示,因此该单元格同时具有蓝色和灰色作为背景色。简短,因为它只是在单击时出现的,但它的确看起来有误。

让NSBrowserCell表现得像NSTextFieldCell一样需要一些反向工程和私有API,因此我认为正确的做法是将NSTextFieldCell子类化并在其中绘制一个图标。代码是这样的,

@implementation BrowserTextFieldCell
- (void)drawInteriorWithFrame:(NSRect)cellFrame controlView:(NSView *)controlView
{
    __auto_type textFrame = cellFrame;
    __auto_type inset = kIconHorizontalPadding * 2 + kIconSize;

    textFrame.origin.x += inset;
    textFrame.size.width -= inset;
    [super drawInteriorWithFrame:textFrame inView:controlView];

    [self drawIconWithFrame:cellFrame];
}

- (void)drawIconWithWithFrame:(NSRect)cellFrame
{
    NSRect iconFrame = cellFrame;
    iconFrame.origin.x += kIconPadding;
    iconFrame.size = NSMakeSize(kIconSize, kIconSize);
    [self.iconImage drawInRect:iconFrame];
}
@end