如何防止2个drawRect:方法中的重复代码?

时间:2012-12-19 05:06:44

标签: cocoa drawrect

我有几行绘图代码,它们在两个不同的子类中重复。当我将此绘图代码移动到它自己的类,然后从drawRect内调用它时:它被调用但它永远不会被绘制到屏幕上。什么是防止在两个不同的drawRect:方法中复制代码的正确方法?

详情:我正在通过继承NSTableViewNSTableCellView来进行自定义控制。我的绘图代码需要在drawRect中:在这两个子类中。

我创建了NSObject的子类,声明了一个方法。以下是实施:

@implementation TNLChartDrawingExtras

- (void)drawDividersInRect:(NSRect)rect startingAtDate:(NSDate *)startDate withZoomFactor:(NSNumber *)zoomFactor {

    float pos = 0;
    NSDate *currentDate = [startDate copy];

    while (pos < rect.size.width) {

        //draw the vertical divider
        NSBezierPath *linePath = [NSBezierPath bezierPathWithRect:NSMakeRect(pos, 0.0, 1.0, rect.size.height)];
        [[NSColor colorWithCalibratedWhite:0.85 alpha:0.5] set];
        [linePath fill];

        //increment the values for the next day
        currentDate = [NSDate dateWithTimeInterval:86400 sinceDate:currentDate]; // add one day to the current date
        pos = pos + (86400.0/ [zoomFactor floatValue]);
    }
}

在我的NSTableView子类中,我为这个对象定义了一个属性。然后在awakeFromNib中我创建了这个类的实例:

- (void)awakeFromNib {
    self.extras = [[TNLChartDrawingExtras alloc] init];
}

drawRect:我发送此邮件:

- (void)drawRect:(NSRect)dirtyRect {
    // more code here...

    [self.extras drawDividersInRect:viewBounds startingAtDate:chart.startDate withZoomFactor:self.zoomFactor];
}

执行代码但不显示应该绘制的行。如果我将drawDividersInRect:...中的代码放在drawRect:方法中,则可以正常使用。

2 个答案:

答案 0 :(得分:1)

如果我继续调试它,我的原始解决方案(在问题中描述)可能有效。但是,我认为更重要的问题是解决这个问题的正确方法是什么。在这里,我通过在项目中添加NSView类别来解决它:

我正在尝试向NSTableViewNSTableCellView添加自定义绘图代码。两者都是NSView的子类,所以我创建了一个NSView的类别,并在那里添加了我的自定义绘图方法。现在我可以从两个子类调用我的绘图方法。

答案 1 :(得分:0)

如果没有看到任何代码,听起来你需要一个协议,这与java语言中的接口是一样的。协议是一系列方法,可能需要使用一些不相关的类。例如,在像PhotoShop这样的绘图程序中,Rects,Ovals和Images都是可以作为.psd文档中的图层存储的有效对象,但是,它们都具有以特定方式更改对象属性的特征。一个例子是调整对象的不透明度或重新缩放对象大小等。访问对象属性以进行缩放的方法或可以在不相关的对象类型之间共享的函数调用协议。

它们本质上是.h文件,列出了方法。定义代码实现的.m文件可以在其.h文件中存储标记。

// example of a class that acts as a protocol implementor
@interface LayerObject: NSObject <Resizable>

标签说:“我是名为X的协议的成员,你可以在我的.m文件中找到协议X的一个/一些方法。”您所要做的就是使用以下语法将协议导入所需的类:

// Declare protocol
@protocol Resizable;
// List methods wanted from protocol
- id resizeRect: id layerObject;

获得协议中定义的方法。

这是一个通过示例描述协议的网站: http://agilewarrior.wordpress.com/2012/03/19/simple-objective-c-protocol-example/

另一种解决方案是创建一个类层次结构,该层次结构使用抽象类来放置您正在使用的给定drawRect方法。从这里您可以定义您正在处理的两个子类作为抽象类的子类,将继承drawRect方法代码,使您不再在两个单独的类中重复代码。