NSPanel има черен фон и текстът е невидим

Опитвам се да накарам конфигурационен лист да се появи за подклас ScreenSaverView. След дълга битка с Xcode, най-накрая успявам да се появи листът за конфигуриране, когато се щракне върху „Опции за скрийнсейвър“ в системните предпочитания (и моят скрийнсейвър е избран) и листът се държи нормално с едно изключение: фонът е черен , правейки текста невидим (вижте изображението).Черен фон на листа за конфигуриране.

Това се случва независимо от това дали листът е NSPanel или NSWindow клас и дали панелът е обикновен панел, помощен панел или HUD панел. Единственото нещо, което изглежда мога да направя, е да променя алфа стойността на панела, което, както се очаква, прави всичко по-прозрачно (но текстът все още не се вижда). Интересното е, че извикването на setOpaque или setBackgroundColor на NSPanel или NSWindow изглежда няма ефект.


person JacobEvelyn    schedule 11.12.2012    source източник


Отговори (1)


За да разберем защо се показва като черен, наистина трябва да видим код за това как създавате прозореца.

Току-що направих бърз тестов проект и изглежда, че работи добре тук. 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") е настроен, както е показано по-долу:

въведете описание на изображението тук

Изпълнението на 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

person NSGod    schedule 12.02.2013