你可以在一个选择器中存储多个方法吗?

时间:2012-07-12 17:23:00

标签: objective-c ios xcode

我有一个类似于程序的谜题,你可以按正确的顺序将块放在一起,以尝试完成拼图。当你完成后,你可以点击播放按钮然后程序将让一个小男人走过你的街区所在的街区。因此,如果您放置一个块,一个块右,一个块下来,然后点击播放程序将调用然后调用方法向上移动,向右移动,向下移动。

当我的程序运行并试图找出要调用的方法以及以什么顺序调用时,我需要在程序找到它们时按顺序存储这些方法,基本上,我不能让程序立即调用方法当它弄清楚要调用哪些方法或者移动块的人会快速移动时,我想将方法​​存储在某种方法数组中(我认为它会像某种选择器一样)所以我可以在我的程序找出了要执行的所有操作后,在一定的时间间隔内调用每个方法。

我的正常程序现在看起来像这样

if(random requirements)
[self moveUp]

else if(random requirements)
[self moveDown]

else if (random requirements)
[self moveRight]

else if(random requirements)
[self moveLeft]
好吧,我希望看起来像这样

if(random requirements)
SEL selector addMethod:[self moveUp]

else if(random requirements)
SEL selector addMethod:[self moveDown]

else if (random requirements)
SEL selector addMethod:[self moveRight]

else if(random requirements)
SEL selector addMethod:[self moveLeft]

显然这不是真正的语法,但你能理解我在寻找什么吗?

1 个答案:

答案 0 :(得分:8)

您不能在一个选择器中存储多个选择器,但制作一个选择器数组是完全有效的事情。最简单的方法是将选择器的字符串表示存储在NSMutableArray中,并从迭代数组的代码中的字符串创建选择器。

NSMutableArray *selectorNames = [NSMutableArray array];
if(random requirements)
    [selectorNames addObject:NSStringFromSelector(@selector(moveUp))];
if(random requirements)
    [selectorNames addObject:NSStringFromSelector(@selector(moveDown))];
...
for (NSString *selectorName in selectorNames) {
    SEL nextSelector = NSSelectorFromString (selectorName);
    // Now you can invoke your selector
}

除了选择器之外的另一个选项是using blocks。块也非常擅长封装动作,并且您不需要单独存储它们的目标。