我第一次在这里写点什么。我有一个问题,希望有人能给我一个答案。
我正在使用Objective-C为Mac OS X Lion开发屏幕保护程序。我已经阅读了一些关于如何使用ScreenSaverView的教程。一切都很完美,直到我插入另一台显示器。然后程序运行所有方法两次(加载xml文件两次)和类似的东西。什么是解决方案?
我应该使用除ScreenSaverView以外的其他内容吗?
谢谢!
答案 0 :(得分:1)
我通常使用单例(全局变量initialed为true)来解决这个问题:
static BOOL gFirst = YES;
然后在类初始化方法中,我将它的值保存到ivar&然后设置全局false:
- (id) initWithFrame: (NSRect) frameRect isPreview: (BOOL) isPreview {
preview = first = NO; // assume failure (pessimist!)
if ( isPreview ) {
preview = YES; // remember this is the preview instance
} else if ( gFirst ) { // if the singleton is still true
gFirst = NO; // clear the singleton
first = YES; // and set the ivar
}
注意:我还将isPreview标志保存到ivar,并且当它为真时不要清除/设置第一个global / ivar。因此,当isPreview为true时,此处的逻辑将预览设置为true,否则将在第一次实例化此类(当isPreview为false时)时首先设置为true,否则将设置为false。
现在在drawRect我使用预览&第一个ivar影响得到的东西......:
- (void) drawRect: (NSRect) inRect {
if ( preview || first ) {
// ADD THE DRAWING CODE FOR THE 1ST MONITOR (or preview view) HERE
} else {
// ADD THE DRAWING CODE FOR THE NTH MONITOR(S) HERE
[super drawRect:inRect]; // draw the default black background
}
}
注意:有些屏幕保护程序在animateOneFrame方法中进行绘制,因此您可能需要在上面移动上面的预览/第一个逻辑。