NSPanel имеет черный фон, а текст невидим

Я пытаюсь создать лист конфигурации для подкласса ScreenSaverView. После долгой битвы с Xcode я наконец-то получаю лист настройки, который появляется, когда в Системных настройках щелкают «Параметры заставки» (и выбрана моя экранная заставка), и лист ведет себя нормально, за одним исключением: фон черный , делая текст невидимым (см. изображение).Черный фон на странице конфигурации.

Это происходит независимо от того, относится ли лист к классу NSPanel или NSWindow и является ли панель обычной панелью, служебной панелью или панелью HUD. Единственное, что я могу сделать, это изменить альфа-значение панели, что, как и ожидалось, делает все более прозрачным (но текст по-прежнему не виден). Интересно, что вызов setOpaque или setBackgroundColor на NSPanel или NSWindow не дает никакого эффекта.


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


Ответы (1)


Чтобы понять, почему оно отображается черным, нам действительно нужно увидеть код того, как вы создаете окно.

Я только что сделал быстрый тестовый проект, и здесь, кажется, все работает нормально. IMO, самое простое решение для создания окна для возврата в методе configureSheet — использовать подкласс NSWindowController для загрузки файла пера, в котором вы заранее настроили окно.

Таким образом, в вашем подклассе 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