Панель конфигурации заставки Cocoa свободно плавает

Я пишу экранную заставку, используя Cocoa 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;
}

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

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

Кто-нибудь знает, что вызывает такое поведение?


person waldrumpus    schedule 04.02.2012    source источник
comment
С тех пор я проверил вывод консоли; ничего подозрительного не обнаружено.   -  person waldrumpus    schedule 12.05.2012


Ответы (2)


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

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

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

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

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

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

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

person Daniel Schneider    schedule 12.05.2012
comment
Вы только что решили обе мои проблемы! Окно прикрепилось правильно, как только я снял галочку "Visible at Launch"; зависание исчезло, как только я очистил "Release when closed". Оба имеют абсолютный смысл, когда вы думаете об этом, но сначала вы должны знать, что они там... Спасибо! - person waldrumpus; 13.05.2012

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

person Logachu    schedule 07.05.2012
comment
Спасибо. Я попробую это, как только вернусь к своему Mac! - person waldrumpus; 07.05.2012
comment
Я проверил код и xib, он настроен так, как вы предложили. - person waldrumpus; 12.05.2012