我正在尝试为ScreenSaverView
子类创建配置表。经过与Xcode的长期斗争,我终于在“系统偏好设置”(并选择了我的屏幕保护程序)中单击“屏幕保护程序选项”时显示配置页,并且表单正常运行,但有一个例外:背景为黑色,使文本不可见(见图)。
无论工作表是NSPanel
还是NSWindow
类,以及该面板是常规面板,实用工具面板还是HUD面板,都会发生这种情况。我唯一能做的就是更改是面板的alpha值,正如预期的那样使一切更透明(但文本仍然不可见)。有趣的是,在setOpaque
或setBackgroundColor
上调用NSPanel
或NSWindow
似乎没有任何效果。
答案 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”)的设置如下所示:
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
最终结果: