Могу ли я передать имя функции в качестве аргумента? - PullRequest
1 голос
/ 27 декабря 2011

Я хочу, чтобы этот класс динамически выполнял функции над собой, передавая ему разные имена.Это возможно ?Или скорее: как это возможно?

-(id)initWithMethod:(NSString*)method{

    if ((self = [super init])){


        [self method];

    }
    return self;
}

-(void) lowHealth {
    CCSprite *blackScreen = [CCSprite spriteWithFile:@"blackscreen.png"];
    blackScreen.anchorPoint = ccp(0,0);
    [self addChild:blackScreen];

    id fadeIn = [CCFadeIn actionWithDuration:1];
    id fadeOut = [CCFadeOut actionWithDuration:1];
    id fadeInAndOut = [CCRepeatForever actionWithAction:[CCSequence actions:fadeIn, fadeOut, nil]];

    [blackScreen runAction:fadeInAndOut];
}

Ответы [ 2 ]

7 голосов
/ 27 декабря 2011

Вы должны использовать performSelector и получить селектор из вашего NSString, используя NSSelectorFromString:

[self performSelector:NSSelectorFromString(method)];

вместо [self method];

1 голос
/ 27 декабря 2011

Стандартным способом является использование селекторов , как указано в ответе Маттео.

Вы также можете посмотреть на Блоки Objective-C .Они становятся очень распространенными в API-интерфейсах CocoaTouch, и вы можете делать с ними очень приятные вещи.Результирующую архитектуру вашего класса часто легче понять IMO.

Например, этот метод из UIView

+ (void)animateWithDuration:(NSTimeInterval)duration 
                 animations:(void (^)(void))animations 
                 completion:(void (^)(BOOL finished))completion

Принимает два блока, один из которых выполняет код для реальной анимации, иодин для кода после завершения анимации.Вы можете вызвать это с помощью переменных блока или написать встроенный код:

...animations:^{
       // animation code
   } 
   completion:^(BOOL finished) {
       // completion code
   }

Получающий метод (в данном случае animateWithDuration: ...) просто вызовет эти блоки в какой-то момент, например:

animations();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...