Swift 如果SKView返回nil,我将如何修复它?

Swift 如果SKView返回nil,我将如何修复它?,swift,uiview,sprite-kit,skscene,Swift,Uiview,Sprite Kit,Skscene,我有一个类包含这个函数 func valueChanged() { run(tapSound) let sceneto = scenes[segment.selectedSegmentIndex] let trans = SKTransition.fade(with: .white, duration: 1.5) if view == nil { print("view is nil") } else { view?.pre

我有一个类包含这个函数

func valueChanged() {
    run(tapSound)
    let sceneto = scenes[segment.selectedSegmentIndex]
    let trans = SKTransition.fade(with: .white, duration: 1.5)
    if view == nil {
        print("view is nil")
    } else {
        view?.presentScene(sceneto, transition: trans)
        print("ran",segment.selectedSegmentIndex,scenes.count)
    }
}

我尝试转换到的每个场景都继承自这个类,所以它们都有这个函数。然而,这个函数运行一次就很好了,场景也发生了变化,但是在第一次之后,视图一直返回nil,我不明白为什么。该函数位于每个场景继承的类中,如果这有任何区别

您的问题需要更多信息,以便我正确诊断它,但从它的外观来看,您正在处理的SKScene已达到零,这允许将其释放

基本上,只要有人仍在使用某个类,该应用程序就会保留该类。创建类实例时,其弧设置为1。当您将该实例保存到其他地方时,它将上升到2。当这些设置为零时,电弧每次下降一次。当它达到零时,它不会在任何地方使用,可以并且将被释放

阵列可能正在使用
变量来创建场景实例。
变量和
变量之间的区别在于前者不向弧添加一个变量,而后者则添加一个变量。如果
scenes[segment.selectedSegmentIndex]
引用了一个弱变量,那么它将是定义的SKScene或nil,这取决于它是否已被释放

最可能的情况是
scenes[]
变量引用了特定场景的实例,但当该场景结束并解除时,它会将该实例设置为nil

需要记住的是,您可能不希望保留SKScene的特定实例,否则将耗尽不必要的内存并加载已播放的场景


最好在数组中保留类类型,并在转换之前重新创建场景。

您的问题需要更多信息,以便我正确诊断它,但从外观上看,您正在处理的SKScene已达到零,这允许取消分配它

基本上,只要有人仍在使用某个类,该应用程序就会保留该类。创建类实例时,其弧设置为1。当您将该实例保存到其他地方时,它将上升到2。当这些设置为零时,电弧每次下降一次。当它达到零时,它不会在任何地方使用,可以并且将被释放

阵列可能正在使用
变量来创建场景实例。
变量和
变量之间的区别在于前者不向弧添加一个变量,而后者则添加一个变量。如果
scenes[segment.selectedSegmentIndex]
引用了一个弱变量,那么它将是定义的SKScene或nil,这取决于它是否已被释放

最可能的情况是
scenes[]
变量引用了特定场景的实例,但当该场景结束并解除时,它会将该实例设置为nil

需要记住的是,您可能不希望保留SKScene的特定实例,否则将耗尽不必要的内存并加载已播放的场景


最好在数组中保留类类型,并在转换之前重新创建场景。

问题中没有足够的信息继续。
view
是否在与此函数相同的类中声明?是否有一个
SKView
实例应该在这些类之间共享?
view
应该如何设置?视图不是由单独的视图类创建的,因此该类不应该删除视图,视图是在应用程序加载时设置的。我认为您的问题不在这段代码中,而是与
view
变量有关,它在哪里、如何声明以及如何设置。如果视图为零,表示场景尚未呈现。例如,在场景的init中,其view属性为nil是正常的。@ChrisHutchison分段控件是否通过@IBOutlet连接到视图控制器?必须在类的实例中调用
valueChanged
函数(您没有将其作为类方法调用),那么如何处理该调用呢?查看视图控制器的代码将非常有用。您的问题中没有足够的信息可以继续。
view
是否在与此函数相同的类中声明?是否有一个
SKView
实例应该在这些类之间共享?
view
应该如何设置?视图不是由单独的视图类创建的,因此该类不应该删除视图,视图是在应用程序加载时设置的。我认为您的问题不在这段代码中,而是与
view
变量有关,它在哪里、如何声明以及如何设置。如果视图为零,表示场景尚未呈现。例如,在场景的init中,其view属性为nil是正常的。@ChrisHutchison分段控件是否通过@IBOutlet连接到视图控制器?必须在类的实例中调用
valueChanged
函数(您没有将其作为类方法调用),那么如何处理该调用呢?查看视图控制器的代码将非常有用。