Обычно я решаю эту проблему с помощью синглтона (глобальная переменная, инициализированная в 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, поэтому вам может потребоваться переместить туда указанную выше предварительную / первую логику.