Cocoa 如何防止2个drawRect:methods中的重复代码?

Cocoa 如何防止2个drawRect:methods中的重复代码?,cocoa,drawrect,Cocoa,Drawrect,我有几行绘图代码,它们在两个不同的子类中重复。当我将此绘图代码移动到它自己的类中,然后从drawRect中调用它时:会调用它,但它从未被绘制到屏幕上。防止在两种不同的drawRect:方法中重复代码的正确方法是什么 详细信息:我正在通过子类化NSTableView和NSTableCellView来创建一个自定义控件。我的绘图代码需要位于drawRect:这两个子类中 我创建了NSObject的一个子类,它声明了一个方法。以下是实施方案: @implementation TNLChartDrawi

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

详细信息:我正在通过子类化
NSTableView
NSTableCellView
来创建一个自定义控件。我的绘图代码需要位于
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]);
    }
}
drawRect:
中,我发送此消息:

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

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

代码被执行,但是它应该画的线没有出现。如果我将
DrawDividerInrect:…
中的代码放在
drawRect:
方法中,它工作得很好。

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

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

// example of a class that acts as a protocol implementor
@interface LayerObject: NSObject <Resizable>
获取协议中定义的方法

以下是一个通过示例描述协议的网站:

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

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


我正在尝试向
NSTableView
NSTableCellView
添加自定义图形代码。两者都是
NSView
的子类,因此我创建了一个
NSView
类别,并在其中添加了我的自定义绘图方法。现在我可以从两个子类中调用我的绘图方法。

您应该添加一些代码,以便我们可以看到您已经在尝试的内容。您是否检查了
self。extras
不是
nil
?这就可以解释了。我不知道协议对我有什么帮助。I协议基本上是一个承诺,即类将实现一个方法。我仍然必须在两个单独的类中实现该方法。@Mike T-如果不能够看到您的代码,很难回答问题。在答案的底部,我提到了一种在层次结构中定义方法的替代解决方案(即NSView)。也许你应该在否决票之前看完答案。嗨,马特,不是我否决了你的答案。实际上,是你的第二个解决方案让我想到了NSView,我正在子类化的两个类都继承了它。@Mike T-谢谢你的支持,我不是有意要指手画脚的。我下班很晚才回家,又累又沮丧。@Matt嗨,Matt,你能帮我解决一个drawRect问题吗?:我同意你的解决办法。这利用了OOP范例和类继承。如果以后可能需要添加其他类型的视图,则仍然可以访问该方法。维护和调试也更容易。@MikeT Mike,你能帮我解决我的问题吗:
// example of a class that acts as a protocol implementor
@interface LayerObject: NSObject <Resizable>
// Declare protocol
@protocol Resizable;
// List methods wanted from protocol
- id resizeRect: id layerObject;