我想让这个类通过向它传递不同的名称来动态地执行函数。那可能吗 ?或者更确切地说:它怎么可能?
-(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];
}
答案 0 :(得分:7)
您应该使用performSelector
并使用NSString
从NSSelectorFromString
获取选择器:
[self performSelector:NSSelectorFromString(method)];
而不是[self method];
答案 1 :(得分:1)
标准方法是使用Matteo答案中提到的Selectors。
您还可以查看Objective-C Blocks。它们在CocoaTouch API中变得非常普遍,你可以用它们做一些非常灵活的事情。由此产生的课程架构通常更容易理解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();