なぜ黒く表示されているのかを理解するには、ウィンドウを作成する方法のコードを確認する必要があります。
簡単なテスト プロジェクトを実行したところ、ここでは問題なく動作するようです。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
ユーザーが [OK] ボタンをクリックすると、サブクラスとの通信を許可する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
最終結果:
サンプル プロジェクト: ScreenSaverFinagler.zip