Панель настроек заставки какао свободно перемещается - PullRequest
2 голосов
/ 04 февраля 2012

Я пишу заставку, используя Coco's ScreenSaver API. Он скомпилирован для 64-битной арки, и я запускаю его на Lion.

Чтобы включить настройку, я добавил следующее к основному виду:

- (BOOL)hasConfigureSheet
{
    return YES;
}

- (NSWindow*)configureSheet
{
    if (configureSheet == nil) {
        if (![NSBundle loadNibNamed: @"WTConfigureSheet" owner: self]) {
            NSLog(@"Failed to load config sheet");
            return nil;
        }
    }

    ScreenSaverDefaults *defaults =
        [ScreenSaverDefaults defaultsForModuleWithName: WTModuleName];

    backgroundColorWell.color = [defaults objectForKey: @"BackgroundColor"];
    lightLetterColorWell.color = [defaults objectForKey: @"LightLetterColor"];
    darkLetterColorWell.color = [defaults objectForKey: @"DarkLetterColor"];

    return configureSheet;
}

После новой установки заставки, нажав «Опции», лист конфигурации будет отображаться не как лист, а свободно перемещаться по экрану без рамки. В противном случае он работает правильно и исчезает после увольнения.

Когда я нажимаю «Опции» во второй раз, лист конфигурации появляется снова, на этот раз правильно, как лист окна настроек. Затем он сразу же зависает, поэтому я не могу нажать ни на один из его элементов управления.

Кто-нибудь имеет представление о причинах такого поведения?

Ответы [ 2 ]

7 голосов
/ 13 мая 2012

У меня была та же проблема, что и у вас сегодня, и мне потребовалось довольно много времени, чтобы разобраться с ней, поэтому вот мое решение:

Я обнаружил, что NSWindow появляется, как только вы звоните loadNibNamed:owner:.Так что должен был быть какой-то механизм для автоматического открытия окон из перьев.

Поэтому я перепроверил перо и увидел, что на панели инспектора атрибутов есть опция с именем "Visible At Launch", которая проверяется по умолчанию..

Решение очень простое: просто снимите этот флажок, и он будет работать, как и ожидалось.

Мне легко не заметить, так как вы ожидаете, что окно откроется, но оно действительно открывается дважды (один разавтоматически и во второй раз, потому что System Preferences.app показывает его в виде листа), что приводит к сбоям.

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

Поэтому обязательно снимите флажок "Release When Closed" в конструкторе интерфейса.

1 голос
/ 07 мая 2012

Чтобы этот код работал как написано, вам нужно создать IBOutlet типа NSWindow* с именем configureSheet в заголовочном файле вашего основного представления, сохранить этот файл, чтобы Interface Builder мог видеть изменения, а затем загрузить WTConfigureSheet.xib Интерфейсный Разработчик и подключите компонент окна верхнего уровня к Владельцу Файлов -> configureSheet.

...