从另一个文件中的 SKScene 中删除 UIView

Posted

技术标签:

【中文标题】从另一个文件中的 SKScene 中删除 UIView【英文标题】:Remove UIView from SKScene in another file 【发布时间】:2018-07-20 14:04:26 【问题描述】:

我有我的GameViewController.swift 和 SKView。

GameScene.swift 中,我创建了覆盖我的场景的 UIView。

var overlayView = UIView(frame: UIScreen.main.bounds) 当我点击屏幕时 (touchesBegan) overlayView.isHidden = truetouchesEndedoverlayView.isHidden = false。 但我有一个问题。当我需要更改某些内容(在另一个 ViewController 中)并返回场景时,当我点击屏幕时,overlayView 不会隐藏。 (新的overlayView,在场景重新加载后出现,覆盖了之前的overlayView。而之前的overlayView“覆盖”了我的场景)

//GameScene.swift 
var overlayView = UIView(frame: UIScreen.main.bounds)

func closeView() 
        overlayView.removeFromSuperview()
        print("hidden")
    


//GameViewController.swift
@IBOutlet var tandmScene: SKView!


override func viewWillAppear(_ animated: Bool) 
    if let scene = SKScene(fileNamed: "TandM") 
        scene.size = self.view.frame.size
        scene.scaleMode = .resizeFill
        tandmScene.presentScene(scene)
    
    tandmScene.ignoresSiblingOrder = true
    tandmScene.showsFPS = true

override func viewWillDisappear(_ animated: Bool) 
GameScene().closeView()

我的overlayView.removeFromSuperview() 不工作。如果我将if let scene = ... 放入 viewDidLoad 我的场景不会改变。

【问题讨论】:

viewWillDisappear 中将GameScene().closeView() 更改为self.closeView() 以解决一个问题。 @Kamran closeView() 是 GameScene 方法,而不是 GameViewController 好的,那么GameViewController 中的GameScene 引用在哪里。用那个。当您执行GameScene() 时,它会创建一个GameScene 的新对象,因此它不会调用为添加覆盖视图而创建的另一个对象的closeView。 @Kamran 我需要在哪里创建参考?如果let tandm = TandMScene() 是一个类变量我有libc++abi.dylib: terminating with uncaught exception of type NSException 错误 【参考方案1】:

我用Notification Center

//GameScene.swift
override func sceneDidLoad() 
        NotificationCenter.default.addObserver(forName: Notification.Name.init("close"), object: nil, queue: OperationQueue.main)  [weak self] (notification) in
            self?.closeView()
        
...


//GameViewController.swift
override func viewWillDisappear(_ animated: Bool) 
        NotificationCenter.default.post(name: Notification.Name.init("close"), object: nil)
...

【讨论】:

以上是关于从另一个文件中的 SKScene 中删除 UIView的主要内容,如果未能解决你的问题,请参考以下文章

UIGestureRecognizer,从另一个类调用选择器

从另一个方法中删除 NSManagedObjectContext 中的对象

从另一个视图中的 MKMapView 中删除注释

从另一个类调用选择器的 UIGestureRecognizer

从集合中删除文档并从另一个集合中的数组中删除 Id

如何从 Sprite Kit 场景中引用当前的 Viewcontroller