2011-02-02 6 views
1

Я попытался вызвать [self setNeedsDisplay: YES] в селекторе NSTimer, чтобы вызвать метод drawRect.NSTimer не влияет ...?

Сначала я поставил код инициализации NSTimer в кнопку FUNC:

-(IBAction)buttonPush:(id)sender 
{ 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
    target:self 
    selector:@selector(myTimerAction:) 
    userInfo:nil 
    repeats:YES]; 
} 

-(void)myTimerAction:(NSTimer *) timer 
{ 
[self setNeedsDisplay:YES]; 
} 

"setNeedsDisplay" называется нормально, но код внутри DrawRect никогда не называется:

- (void)drawRect:(NSRect)dirtyRect 
{ 
NSLog(@"drawRect"); 
} 

Тогда Я попытался переместить код инициализации NSTimer в "- (id) initWithFrame: (NSRect) frame", тогда все работает отлично. (drawRect вызывается правильно каждые 1 сек).

В чем разница между этими двумя способами выше? Что делать, если я хочу запустить таймер кнопкой?

+0

Из описания все должно работать нормально. Нет никакой ошибки или чего-либо намека на то, что происходит не так. Ошибка в другом месте. Вы должны опубликовать больше контекста или кода. –

+0

Я предполагаю, что вы не забыли подключить действие к своей кнопке? Попробуйте поместить инструкцию NSLog в свой метод '-buttonPush:' и посмотреть, выводится ли она. –

ответ

1

Просто интересно, в каком классе находится этот код? Я бы предположил, что кнопка Push: действие находится внутри контроллера, правильно?

Если да, то вы должны иметь:

-(void)myTimerAction:(NSTimer *) timer 
{ 
    [[self view] setNeedsDisplay:YES]; 
} 

потому setNeedsDisplay: это метод NSView, не NSViewController.

(кстати, вероятно, причина, почему это работает, если вы поместите его в initWithFrame: потому, что один является NSView инициализатор: Я предполагаю, что, когда вы перемещаете код там вы также перемещение myTimerAction : метод, который затем «себя» правильно ссылаясь на мнение)

+0

Спасибо за ответ, но код класса находится в NSView, и если я попытаюсь изменить код на «self view», я получу ошибку: «..... не отвечает на -view» – supersurabbit

+0

Не уверен, что я следую больше. Вероятно, повторим очевидное, но чтобы убедиться, что мы находимся на одной странице: put buttonPush: и myTimerAction: в вашем контроллере просмотра. Оставьте drawRect: внутри вашего пользовательского представления. Для реализации myTimerAction используйте мой код выше, который ссылается на [self view] – ettore

0

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

+0

OP уже подтвердил, что [self setNeedsDisplay:] выполняется. –