Какао: загрузка представления из класса NSViewController - PullRequest
0 голосов
/ 25 декабря 2011

Насколько я понимаю, представление класса NSViewController должно быть загружено до того, как что-либо может быть изменено в представлении через сеттеры и геттеры. Проблема в том, что представление в контроллере должно отображать обратный отсчет, поэтому класс контроллера представления имеет NSTimer, который будет изменять stringValue каждую секунду. Но из того, что я вижу, я должен использовать что-то вроде:

[instanceOfViewControllerClass view] в другом классе, чтобы представление загружалось, а затем setStringValue работало бы.

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

В основном то, что я ищу, это то, что работает так:

//ViewControllerClass.m
-(void)startCountdown{
//here I make "invocation" using NSInvocation
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdown)];
timerLabelUpdater = [NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES];
}

-(void)updateCountdown {
//x would be calculated here by deducting 1 from an original amount of time
[timeLeftLabel setStringValue:@"x"];
}

Все работает нормально, если я помещаю NSLog в updateCountdown, он отлично регистрируется, что означает, что он работает, я просто не могу заставить метку измениться.

Используя ответ выше, я пытался использовать [self view] и [self loadView] в нескольких местах кода выше, но ни одно из них не имеет значения.

Надеюсь, я уже понял, что я ищу на этот раз, любая помощь будет признательна.

1 Ответ

0 голосов
/ 25 декабря 2011

Как вы инициализируете контроллер вида? Это заархивировано в перо, или вы делаете это в коде? Я думаю, что вы на самом деле не говорите, с каким пером это связано.

Если это часть пера, вам нужно установить правильное поле имени пера в инспекторе атрибутов.

Если вы создаете его экземпляр в коде, вам нужно явно сказать ему, как называется его перо.

Самый простой способ - переопределить init примерно так:

- (id)init {
    self = [super initWithNibName:@"MyViewController" bundle:nil];
    if (self) {
        // Initialization code here.
    }
    return self;
}
...