Передать метод в качестве аргумента

могу ли я передать метод в качестве аргумента? Мне не удается передать метод targetOpenView в приведенном ниже примере:

-(void) targetTimeView:(id)sender {    
[self TimeViewWithtimeInterval:.6 selector:targetOpenView]; //targetOpenView does NOT work
}

-(void) timeViewWithtimeInterval:(float)interval selector:openViewMethod{
[NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(openViewMethod) userInfo:nil repeats:NO];   
}

Любые предложения, как я мог бы сделать эту работу? Спасибо!


person html_programmer    schedule 13.10.2011    source источник
comment
Методы всегда должны начинаться со строчных букв; то есть timeViewWithTimeInterval:selector:.   -  person bbum    schedule 13.10.2011
comment
ок, приму к сведению.   -  person html_programmer    schedule 13.10.2011


Ответы (1)


Вам нужна директива компилятора @selector для извлечения выбора из имени метода, как вы это делали при создании таймера:

[self TimeViewWithtimeInterval:.6 selector:@selector(targetOpenView)];

И определите свой аргумент для типа SEL:

-(void) TimeViewWithtimeInterval:(float)interval selector:(SEL)openViewMethod
{    
 ...
}

Затем при передаче аргумента методу NSTimer вы можете не указывать @selector, так как тип уже является селектором:

[NSTimer scheduledTimerWithTimeInterval:interval target:self
                               selector:@selector(openViewMethod) /* here */
                               userInfo:nil repeats:NO];   

[NSTimer scheduledTimerWithTimeInterval:interval target:self
                               selector:openViewMethod /* pass it directly */
                               userInfo:nil repeats:NO];
person sidyll    schedule 13.10.2011
comment
Эй, спасибо, но я получаю сообщение об использовании неопределенного идентификатора targetOpenView в строке [self TimeViewWithtimeInterval:.6 selector: targetOpenView]... - person html_programmer; 13.10.2011
comment
Обновите свой вопрос с тем, что вы пробовали. Этот ответ правильный. - person bbum; 13.10.2011
comment
Я добавил (SEL) в метод TimeViewWithTimeInterval, но проблема заключается именно в методе targetTimeView. Я сразу получаю сообщение об ошибке, когда я набираю targetOpenView... он не позволяет мне указать метод в качестве аргумента... - person html_programmer; 13.10.2011
comment
Не беспокойтесь :-) Я только что обновил ответ, добавив что-то, что я пропустил. - person sidyll; 13.10.2011
comment
Хм, извини, чувак; код работает, но, к сожалению, при запуске кода появляется другое сообщение: 2011-10-13 19:35:12.806 Test[37435:707] *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «- [mainViewController openViewMethod]: нераспознанный селектор отправлен экземпляру 0x19d2a0 'Должен ли я сделать новый пост для этого вопроса? - person html_programmer; 13.10.2011
comment
Странно, просто чтобы подтвердить: раздел, который я обновил, находится внутри вашего второго метода, показанного здесь. Вы используете его без @selector там, верно? - person sidyll; 13.10.2011
comment
Дерьмо, чувак, я куплю себе очки! И надо быть ясновидящим, чтобы это знать! Еще раз спасибо! - person html_programmer; 13.10.2011