2

我用相对的 NSCell 创建了一个非常简单的 NSControl 来进行一些测试。要在 Window 上添加此控件,我通过拖动 NSView 的“Interface Builder”添加它,然后将其类更改为MyControl.

这是我的代码:

NSControl

@implementation MYControl


+ (void)initialize
{
    if (self == [MYControl class])
    {
        [self setCellClass: [MYCell class]];
    }
}

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    }

    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
    }

    return self;
}


+(Class)cellClass{  
    return [MYCell class];
}


@end

NS细胞

@implementation MYCell

-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView{  
    /*
    [[NSGraphicsContext currentContext]saveGraphicsState];
    [[NSColor redColor]set];
    [NSBezierPath fillRect:cellFrame];
    [[NSGraphicsContext currentContext]restoreGraphicsState];*/
}
@end

如果我从 NSControl 类中删除对 MyCell 的所有引用,它会起作用(但显然什么也没显示),否则,启动应用程序会出现一些错误:

<Error>: kCGErrorFailure: CGSShapeWindow 

<Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.

_NXPlaceWindow: error setting window shape (1000)

<Error>: kCGErrorFailure: CGSShapeWindow

_NSShapeRoundedWindowWithWeighting: error setting window shape (1000)

我错了什么?如何通过 XCode4/IB 正确设置自定义 NSControl?从文档中我读到了一些关于 IB Palette 的内容,但我认为我不能在 Xcode 4.0 中使用它

编辑:

使用 initWithFrame 以编程方式添加 NSControl 它可以工作

4

1 回答 1

3

我相信我终于找到了答案。

-cellSize 方法必须在您的 NSCell 子类中被覆盖。经过大量堆栈跟踪后,我发现此方法将返回 (40000, 40000) 作为您的单元格大小,如果它没有被覆盖,从而产生我们看到的大小错误。由于我的 NSCell 中有特殊需要,需要单元格占据整个 NSControl 的绘图区域,所以我简单地使用了以下内容。

- (NSSize)cellSize {
    return self.controlView.bounds.size;
}

希望这对您的情况有所帮助。

于 2012-08-31T20:19:41.033 回答