Cocoa: загрузка представления из класса NSViewController

Насколько я понимаю, представление класса 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] в нескольких местах кода выше, но ни один из них не имеет значения.

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


person Elbimio    schedule 25.12.2011    source источник


Ответы (1)


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

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

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

Самый простой способ — переопределить init следующим образом:

- (id)init {
    self = [super initWithNibName:@"MyViewController" bundle:nil];
    if (self) {
        // Initialization code here.
    }
    return self;
}
person Francis McGrew    schedule 25.12.2011
comment
Ничего не произошло, я использовал - (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil { self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; if (self) { } return self;} Что, я думаю, не так уж и отличается. - person Elbimio; 25.12.2011
comment
Вы создаете контроллер представления в коде? Или он у вас есть где-то в кистях? Если у вас есть if в nib, вам нужно присвоить ему имя nib. - person Francis McGrew; 25.12.2011
comment
Я только что добавил классы NSViewController, в конце ничего нет. - person Elbimio; 25.12.2011