3

我注意到我的 Swift 项目中有一个奇怪的行为,并以这种方式在一个空的 SpriteKit 项目中复制了它:

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

        let sprite = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite)
        //sprite.removeFromParent()

        let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite2)
        sprite2.removeFromParent()
    }
}

它在应用程序启动之前崩溃,我只能看到: xCode 截图

我的配置是 xCode6-Beta6、带有 iOS8-Beta5 和 OSX 10.9.4 的 iPad Mini Retina。我还在模拟器中重现了这个错误;使用 xCode6-Beta5;touchesBegan并在方法中移动代码

取消注释该行sprite.removeFromParent()会使错误消失。

4

2 回答 2

6

重要提示:自 iOS 8.1 以来,此错误已得到纠正,请务必更新并使您的应用程序无法用于 iOS 8.0 及更早版本。

我发现发生了什么……应该是某个苹果员工犯了错误。说明:

let sprite = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "true"
// Then crash

如果你这样做:

let sprite = SKSpriteNode(imageNamed:"Spaceship")
sprite.name = "1"
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
sprite2.name = "2"
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "false"
// Then all is right, no crash

我认为非常简单,当您调用.removeFromParent()Apple 的代码检查代码中的相等性时,==就像他们在Objective-C中所做的那样。但由于它是Swift,你应该===检查对象是否相等而不是==,所以这是一个愚蠢的错误。

恭喜你在 SpriteKit 代码中发现了一个错误,去 Apple 填写表格:D

于 2014-08-21T13:56:44.187 回答
0

仅当 SKNode 具有相同的名称和相同的类时才会发生这种情况。设置为 SKNode 唯一名称。

我的代码: - (void) removeItemWithIdentifier:(FoodsIdentifiers) identifier{

NSArray *items = [foodItemHolderNode children];
int count = (int)[items count];
for (int i = 0; i < count; i++) {
    FoodItemObject *foodItem = [items objectAtIndex:i];
    int itemID = [[foodItem.objectDictionary objectForKey:FOODITEM_IDENTIFIER_KEY] intValue];

    if (itemID == identifier) {
        [foodItem removeFromParent];
        break;
    }

}

// NSString *name = [NSString stringWithFormat:@"ID%i", (int)identifier];
//SKNode *item = [foodItemHolderNode childNodeWithName:name];
//[item removeFromParent];

警告从具有相同名称错误的父级中删除!!!!!!!!!

于 2014-09-11T10:35:51.103 回答