Objective c 为什么';这真的是一个简单的白色屏幕保护程序吗?(它是黑色的)

Objective c 为什么';这真的是一个简单的白色屏幕保护程序吗?(它是黑色的),objective-c,macos,cocoa,screensaver,Objective C,Macos,Cocoa,Screensaver,我正试图通过XCode中的Objective-C制作一个简单的macOS屏幕保护程序,它只会用白色填充整个屏幕。(因为)很简单,对吗?我也这么认为,但无论我做什么,我都会得到一个空白的黑屏。似乎我的drawRect方法甚至没有被调用。知道我错过了什么吗 #import "Blank_WhiteView.h" @implementation Blank_WhiteView - (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview {

我正试图通过XCode中的Objective-C制作一个简单的macOS屏幕保护程序,它只会用白色填充整个屏幕。(因为)很简单,对吗?我也这么认为,但无论我做什么,我都会得到一个空白的黑屏。似乎我的drawRect方法甚至没有被调用。知道我错过了什么吗

#import "Blank_WhiteView.h"

@implementation Blank_WhiteView

- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview {
    [super animateOneFrame];
    [self setNeedsDisplay:YES];
    return self;
}

- (void)drawRect:(NSRect)rect {

    [super drawRect:rect];
    CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(context, NSRectToCGRect(rect));
}

- (BOOL)hasConfigureSheet {
    return NO;
}

@end

ScreenSaverView
通过
-animateOneFrame
绘制所有内容。为了能够使用
-drawRect
(在您的情况下,您应该实现
animateOneFrame
,因为您没有制作任何动画),以便:

- (void)animateOneFrame {
    [self setNeedsDisplay:YES]; // -drawRect will be called next draw loop
}

这样,在适当的时候将调用
-drawRect

Quartz composer甚至图片屏幕保护程序可能是很好的非代码方式来实现这一点。

您可以使用xcode运行此操作,并在drawRect方法中放置一个断点以查看是否调用它吗?您也可以像这样绘制[NSColor.whiteColor set];NSRectFill(view.bounds);谢谢,马克。我真希望我能。我确实怀疑drawRect从未被调用过,但显然没有(直接的)方法在调试器中运行屏幕保护程序。今天早些时候,我也尝试了你确切的drawRect建议,但效果完全一样。我似乎遗漏了ScreenSaverView基类的工作原理。