NSPanel具有黑色背景,文本不可见

时间:2012-12-11 00:42:11

标签: objective-c xcode xcode4 screensaver nspanel

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

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

1 个答案:

答案 0 :(得分: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子类进行通信。

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

enter image description here

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

最终结果:

enter image description here

示例项目:ScreenSaverFinagler.zip