Разное содержимое в нескольких мониторах [Objective-C - ScreenSaverView] - PullRequest
1 голос
/ 08 февраля 2012

Впервые я пишу что-то здесь. У меня есть вопрос, на который, я надеюсь, кто-то может дать мне ответ.

Я разрабатываю заставку для Mac OS X Lion с использованием Objective-C. Я прочитал несколько учебных пособий о том, как сделать с помощью ScreenSaverView. Все отлично работает, пока я не подключу другой монитор. Затем программа запускает все методы дважды (дважды загружает xml-файл) и все в таком духе. Какое решение для этого?

Должен ли я использовать что-то еще, кроме ScreenSaverView?

Спасибо!

1 Ответ

1 голос
/ 12 февраля 2012

Обычно я решаю эту проблему с помощью синглтона (глобальная переменная, инициализированная в true):

static BOOL gFirst = YES;

Затем в методе инициализации класса я сохраняю его значение в ivar, а затем устанавливаю глобальное false:

- (id) initWithFrame: (NSRect) frameRect isPreview: (BOOL) isPreview {

    preview = first = NO;     // assume failure (pessimist!)
    if ( isPreview ) {
        preview = YES;        // remember this is the preview instance
    } else if ( gFirst ) {    // if the singleton is still true
        gFirst = NO;          // clear the singleton
        first = YES;          // and set the ivar
    }

Примечание: я также сохраняю флаг isPreview на ivar и не очищаю / не устанавливаю первый глобальный / ivar, когда он равен true.Таким образом, логика здесь установит предпросмотр в значение true, когда isPreview равно true, в противном случае будет установлено первое значение true при первом создании экземпляра этого класса (когда isPreview имеет значение false), а в противном случае - false.

Теперь в drawRect я использую превью &первые ивары влияют на то, что рисуется…:

- (void) drawRect: (NSRect) inRect {
    if ( preview || first ) {
        // ADD THE DRAWING CODE FOR THE 1ST MONITOR (or preview view) HERE
    } else {
        // ADD THE DRAWING CODE FOR THE NTH MONITOR(S) HERE
        [super drawRect:inRect];    // draw the default black background
    }
}

Примечание: некоторые хранители экрана рисуют в своем методе animateOneFrame, поэтому вам может потребоваться переместить туда указанную выше предварительную / первую логику.

...