Objective c 如何在Cocoa/Obj-C中激活自定义屏幕保护程序预览?

Objective c 如何在Cocoa/Obj-C中激活自定义屏幕保护程序预览?,objective-c,cocoa,macos,screensaver,Objective C,Cocoa,Macos,Screensaver,我已经创建了一个相当简单的屏幕保护程序,在MacOS10.6.5上运行,没有问题 配置屏幕已经积累了很多不同的选项,我正在尝试在configureSheet窗口上实现我自己的预览,这样用户(目前只有我)就可以立即看到更改的效果,而无需确定并测试每个更改 我在配置表中添加了一个NSView,并将Interface Builder中的自定义类设置为我的ScreenSaverView子类。我知道drawRect:正在启动,因为我可以删除将视图清除为黑色的条件,并且我的自定义预览不再以黑色背景显示。 以

我已经创建了一个相当简单的屏幕保护程序,在MacOS10.6.5上运行,没有问题

配置屏幕已经积累了很多不同的选项,我正在尝试在configureSheet窗口上实现我自己的预览,这样用户(目前只有我)就可以立即看到更改的效果,而无需确定并测试每个更改

我在配置表中添加了一个
NSView
,并将Interface Builder中的自定义类设置为我的ScreenSaverView子类。我知道
drawRect:
正在启动,因为我可以删除将视图清除为黑色的条件,并且我的自定义预览不再以黑色背景显示。 以下是该功能(基于互联网上的一些优秀教程):

spiroForm类只是使用
NSBezierPath
将自己绘制到ScreenSaverView框架中,正如前面提到的,对于实际的屏幕保护程序或内置的系统首选项预览来说没有问题。自定义预览(configureView)框架被传递到本身的init方法中(因为它的自定义类是my ScreenSaverView子类)。在将configureSheet对象返回操作系统之前,在configureSheet中调用
-initWithFrame
方法:

[configureView initWithFrame:[configureView bounds] isPreview:YES];
也许我不必那么做?我只是想看看画画是否需要它

我最终在配置表中添加了一个委托,尝试通过
windowWillBeginSheet
windowWillEndSheet
通知触发预览的
startAnimation
stopAnimation
功能,但这些功能似乎由于某种原因没有被调用。委托被声明为
NSObject
,在返回configureSheet对象之前,我在configureSheet方法中设置了委托

我已经为此工作了好几天,但还没有找到任何关于操作系统如何管理ScreenSaverView对象的信息(我想这正是我试图通过运行自己的副本来模拟的)


有没有人对如何管理这一点有什么建议,或者苹果是否在我没有找到的地方记录了它?这并不是屏保工作所必需的,我只是觉得它很有趣(我也寻找了一种使用操作系统预览的方法,但在激活配置表时它被阻止了。)

好的,解决方案涉及到一些“无聊”的时刻:

首先,我将工作表通知的委托设置为工作表本身。工作表所属的窗口获取通知

其次,工作表所属的窗口属于系统首选项,我看不到任何方法将我的委托类设置为该窗口的委托,因此整个委托问题似乎不是一个可行的解决方案

最后,我为configureSheet子类化了NSWindow,这样我就可以通过使用makeyWindow和close方法在预览中启动和停止动画

- (void) makeKeyWindow
{
   if (myPreview != nil)
      if ( ! [myPreview isAnimating])
      {
         [myPreview startAnimation];
      }
   [super makeKeyWindow];
}
我还必须为预览对象本身添加一个IBOutlet,并在Interface Builder中连接它


仍在解决一些问题,但现在当我单击我的屏幕保护程序选项按钮时,我的配置表会在您设置选项时下拉并显示其自己的预览。嘘。我为这些小细节而跳出的圈圈。不管怎样,我喜欢它。向前和向上。

请花点时间使用编辑器控件正确格式化代码。感谢您的编辑,我不是一个经常在网上张贴的人,直到看到您的评论,我才注意到编辑器控件。
- (void) makeKeyWindow
{
   if (myPreview != nil)
      if ( ! [myPreview isAnimating])
      {
         [myPreview startAnimation];
      }
   [super makeKeyWindow];
}