За да разберем защо се показва като черен, наистина трябва да видим код за това как създавате прозореца.
Току-що направих бърз тестов проект и изглежда, че работи добре тук. 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
, след като потребителят щракне върху бутона OK.
Ниб файлът за класа MDScreenSaverOptionsWindowController
(с име "MDScreenSaverOptionsWindowController.xib") е настроен, както е показано по-долу:
![въведете описание на изображението тук](https://i.stack.imgur.com/LWQVG.png)
Изпълнението на 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
Крайният резултат:
![въведете описание на изображението тук](https://i.stack.imgur.com/S9hpN.png)
Примерен проект: ScreenSaverFinagler.zip
person
NSGod
schedule
12.02.2013