如何使用特定的"名称循环遍历所有对象"?

时间:2014-03-24 05:00:45

标签: objective-c sprite-kit

好的,所以我在这里并不是将name作为属性赋予对象,而是对象名称。

例如,

如果我有:

{
    SKSpriteNode *_one;
    SKSpriteNode *_two;
}

现在我想让所有的_two消失,我该怎么办?

传统上,我可以这样做:

_two.name = @"two"

然后像这样使用for循环:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (SKSpriteNode *node in self.children) {
        if ([node.name isEqualToString:@"two"]){
            //Make them disappear here.
        }
    }
}

现在,这非常困难。我想要一些像这样的代码:

{
    SKSpriteNode *_one;
    SKSpriteNode *_two;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (/*some code that picks up all the "_two"s*/) {
        //Make them disappear here.
    }
}

这些错误

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    ////ATTENTION!!!!////

    for (_two in self.children) {

    ////ATTENTION!!!!////

        //Make them disappear here.
    }
}

如果您有方法,请分享!感谢。

4 个答案:

答案 0 :(得分:3)

Sprite Kit有一个内置的方法。

[self enumerateChildNodesWithName:@"two" usingBlock:^(SKNode *node, BOOL *stop) {
        [node removeFromParent];
}];

根据Apple的documentation

  

此方法按顺序枚举子数组,搜索节点   其名称与搜索参数匹配。该块被调用一次   与name参数匹配的每个节点。

答案 1 :(得分:2)

用于保存对象引用的变量的名称与它在任何时间点引用的任何对象之间没有任何关联。此外,对象没有这样的名称;它们具有地址 - 存储在引用它们的变量中的值。所以你所要求的只是没有意义。

答案 2 :(得分:2)

假设您将所有SKSpriteNode对象存储在数组中。因此,您可以使用NSPredicate来有条件地过滤数据。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ ",@"two"];
NSArray *allTwos = [yourArray filteredArrayUsingPredicate:predicate];
for (SKSpriteNode *node in allTwos) {
        //Make them disappear here.
}

答案 3 :(得分:1)

以这种方式尝试这样做并不是一个好主意。首先,它似乎不可能反省一个对象的名称,尽管你可以轻松地为这个类做。其次,虽然你只有两个对象似乎很实用但是当你得到更多时你会想要根据部分名称开始做它,如果你开始对许多对象进行多个部分字符串比较,那么事情就会变慢时间。

尝试使用从SKNode继承的userData属性。如果您需要记录某个节点属于某个特定类,或者在某个特定时间停止需要,这看起来是最好的方法。

如果您的节点都在一个数组中,您可以使用- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate获取您想要操作的所有节点(make消失...) - 编写谓词以使用某些userData键过滤所有节点你已经设定了。