错误:尝试添加已有父级的SKNode

时间:2017-01-02 17:36:16

标签: ios swift sprite-kit swift3

我正在使用Swift 3和SpriteKit进行游戏,我尝试在GameScene的其余部分中声明一个全局变量来处理它但我无法做到。我做了什么:

...
personaje.position = CGPoint.zero
addChild(personaje)
...

在全局声明之后,我试图在sceneDidLoad中使用它:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
      <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >
        <TableLayout
              android:id="@+id/tableLayout1"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content">
          <TableRow
             android:gravity="center_horizontal"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
            <TextView
              android:layout_width="wrap_content" 
              android:layout_height="wrap_content"
               android:gravity="center_horizontal"
              android:textSize="11sp"
                  android:text="Falta 220 V" />
            <RadioGroup android:orientation="horizontal">

              <RadioButton android:id="@+id/rdAlarma"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                            android:textSize="11sp"
                      android:textStyle="bold"
                  android:text="SI" />
              <RadioButton android:id="@+id/rdCCTV"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                            android:textSize="11sp"
                      android:textStyle="bold"
                  android:text="NO" />
              <RadioButton android:id="@+id/rdIncedio"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                            android:textSize="11sp"
                      android:textStyle="bold"
                 android:text="NA" />
            </RadioGroup>
          </TableRow>
         
        </TableLayout>
       
      </LinearLayout>
</FrameLayout>

我不知道为什么但Xcode会返回此错误:

  

***由于未捕获的异常终止应用&#39; NSInvalidArgumentException&#39;,原因:&#39;尝试添加一个SKNode   已经有一个父母:姓名:&#39;(null)&#39;   质地:[&#39; Ball2.png&#39; (150 x 146)]职位:{0,0}   比例:{1.00,1.00}大小:{150,146}锚:{0.5,0.5}轮换:0.00&#39;

提前感谢您的想法和解决方案!

3 个答案:

答案 0 :(得分:7)

我怀疑您是否尝试添加已有父级的SKNode,这是不可能的。

在将节点添加到新节点之前,从普通父节点中删除该节点:

personaje.removeFromParent();
addChild(personaje)

或创建一个新节点:

let newPersonaje = SKSpriteNode(imageNamed: "Ball2.png")
addChild(newPersonaje)

答案 1 :(得分:2)

错误在于您无法添加已有父级的SKNode。当您将personaje节点声明为场景的属性时,您可以在场景中的任何位置引用它,但您只需将其添加到场景一次。

如果您需要再次添加,则必须先将其从父目录中删除:

personaje.removeFromParent()
addChild(personaje)

答案 2 :(得分:2)

正如在其他答案中所解释的那样,您已声明并初始化了一个var,因此无需添加到当前类,因为它已经添加了。

而不是这种语法(如果你不需要因为getter只读属性而改变你的精灵),你也可以写:

var personaje : SKSpriteNode! {
        get {
            return SKSpriteNode(imageNamed: "Ball2.png")
        }
}

// you can also use only one line for convenience:
// var personaje : SKSpriteNode! { get { return SKSpriteNode(imageNamed: "Ball2.png")} }

override func didMove(to view: SKView) {
        addChild(personaje)
}

使用此代码,您可以声明全局变量,但只有在将其添加到类中时才会通过getter模式进行初始化。