1

我正在尝试为ScreenSaverView子类显示配置表。经过与 Xcode 的长期斗争,我终于在系统偏好设置中单击“屏幕保护程序选项”时出现配置表(并且选择了我的屏幕保护程序),并且该表的行为正常,但有一个例外:背景为黑色,使文本不可见(见图)。配置表上的黑色背景。

无论工作表是一个NSPanelNSWindow类,以及面板是常规面板、实用程序面板还是 HUD 面板,都会发生这种情况。我似乎唯一能做的就是改变面板的 alpha 值,正如预期的那样,它使一切变得更加透明(但文本仍然不可见)。有趣的是,调用setOpaqueorsetBackgroundColor上的NSPanelorNSWindow似乎没有任何效果。

4

1 回答 1

2

要弄清楚它为什么显示为黑色,我们真的需要查看有关如何创建窗口的代码。

我刚刚做了一个快速测试项目,它似乎在这里工作正常。IMO,在该方法中创建要返回的窗口的最简单解决方案configureSheet是使用NSWindowController子类来加载您已提前配置窗口的 nib 文件。

因此,在您的ScreenSaverView子类中,您将定义一个类似于以下内容的接口:

@interface MDScreenSaverFinaglerView : ScreenSaverView {
    MDScreenSaverOptionsWindowController        *optionsWindowController;

    NSInteger                                    screenSaverViewMode;
}

@property (nonatomic, retain) MDScreenSaverOptionsWindowController
                                             *optionsWindowController;

@property (nonatomic, assign) NSInteger screenSaverViewMode;

@end

对于该方法,您的实现将如下所示configureSheet

- (NSWindow *)configureSheet {
    if (optionsWindowController == nil) {
        optionsWindowController = [[MDScreenSaverOptionsWindowController alloc]
                                                  initWithScreenSaverView:self];
    }
    return optionsWindowController.window;
}

基本上,您检查optionsWindowController实例是否存在,必要时创建它,然后返回它的window.

自定义NSWindowController子类的接口如下所示:

@interface MDScreenSaverOptionsWindowController : NSWindowController {
    IBOutlet NSMatrix                *optionsMatrix;

    MDScreenSaverFinaglerView        *screenSaverView;    // non-retained/weak reference
}

- (id)initWithScreenSaverView:(MDScreenSaverFinaglerView *)aView;

@property (nonatomic, assign) MDScreenSaverFinaglerView *screenSaverView;

- (IBAction)ok:(id)sender;

@end

一旦用户单击“确定”按钮,有一个screenSaverView属性将允许与子类进行通信。ScreenSaverView

类的 nib 文件MDScreenSaverOptionsWindowController(名为“MDScreenSaverOptionsWindowController.xib”)的设置如下所示:

在此处输入图像描述

的实现MDScreenSaverOptionsWindowController如下所示:

@implementation MDScreenSaverOptionsWindowController

@synthesize screenSaverView;

- (id)initWithScreenSaverView:(MDScreenSaverFinaglerView *)aView {
    NSParameterAssert(aView != nil);
    if ((self = [super initWithWindowNibName:NSStringFromClass([self class])])) {
        self.screenSaverView = aView;
    }
    return self;
}

- (void)windowDidLoad {
    [super windowDidLoad];
    [optionsMatrix selectCellWithTag:screenSaverView.screenSaverViewMode];
}

- (IBAction)ok:(id)sender {
    NSInteger viewMode = [optionsMatrix selectedTag];
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber
                  numberWithInteger:viewMode] forKey:MDScreenSaverViewModeKey];
    screenSaverView.screenSaverViewMode = viewMode;
    [NSApp endSheet:self.window];
}
@end

最终结果:

在此处输入图像描述

示例项目:ScreenSaverFiagler.zip

于 2013-02-12T00:40:15.213 回答