ios – SpriteKit在转换到新场景时收到有关UIElements的错误

ios – SpriteKit在转换到新场景时收到有关UIElements的错误,第1张

概述您好我正在使用 Swift的SpriteKit游戏,现在只有两个场景,一个加载场景和游戏场景.游戏场景到达数据库以在呈现之前获取信息.游戏场景中的一切都很棒.当我首先进入装载场景而不是直接进入游戏场景时,我遇到了问题.通过回调,我告诉加载场景,一旦完成数据库 *** 作就会呈现游戏场景.然而,当我尝试呈现时,我得到了10个这样的大错误: 2015-11-12 09:48:33.880 SpaceAcade 您好我正在使用 Swift的SpriteKit游戏,现在只有两个场景,一个加载场景和游戏场景.游戏场景到达数据库以在呈现之前获取信息.游戏场景中的一切都很棒.当我首先进入装载场景而不是直接进入游戏场景时,我遇到了问题.通过回调,我告诉加载场景,一旦完成数据库 *** 作就会呈现游戏场景.然而,当我尝试呈现时,我得到了10个这样的大错误:

2015-11-12 09:48:33.880 SpaceAcademy[2373:764586] This application is
modifying the autolayout engine from a background thread,which can
lead to engine corruption and weird crashes. This will cause an
exception in a future release. (followed by a bunch of random info)

现在通过一些测试,我发现它是我的UIElement,例如按钮,滑块和标签,这些都是导致这种情况发生的.但是我将它们移动到了dIDMovetoVIEw函数中,所以我很困惑为什么它们仍然会抛出错误,因为它们位于“后台线程”中.

还奇怪的是,这些都不是致命的错误.我的控制台刚刚爆炸,UIElements在延迟十秒后出现.其他奇怪的是,如果我点击我知道按钮应该是的位置,该功能仍然被调用,就像按钮实际上在那里一样.

我非常感谢摆脱控制台爆炸的解决方案,但更重要的是摆脱了UI元素出现的十秒延迟,谢谢!

代码设置场景

let skVIEw = vIEw as! SKVIEw    skVIEw.showsFPS = false    skVIEw.showsNodeCount = false    skVIEw.ignoresSiblingOrder = true    let scene = GameScene(size: vIEw.bounds.size)    scene.scaleMode = SKScenescaleMode.Resizefill    let loading = LoadingScene(size: vIEw.bounds.size,newScene: scene)    skVIEw.presentScene(loading,Transition: SKTransition.crossFadeWithDuration(1))    scene.setEverythingUp(loading)

加载场景:

import Foundationimport SpriteKitclass LoadingScene:SKScene{    var newScene:SKScene!    var oldCount = 0    var loadCount = 0{    dIDSet{        print(loadCount)        if loadCount == 0{            if oldCount == 1{                self.vIEw?.presentScene(newScene)            }        }        oldCount = loadCount    }}init(size: CGSize,newScene:SKScene) {    self.newScene = newScene    super.init(size: size)}required init?(coder aDecoder: NSCoder) {    fatalError("init(coder:) has not been implemented")}overrIDe func dIDMovetoVIEw(vIEw: SKVIEw) {    self.backgroundcolor = UIcolor.blackcolor()    let imageArray = [        SKTexture(imagenamed: "Loader/Loader1.png"),SKTexture(imagenamed: "Loader/Loader2.png"),SKTexture(imagenamed: "Loader/Loader3.png")    ]    let loader = SKSpriteNode(texture: imageArray[0])    let animation = SKAction.animateWithTextures(imageArray,timePerFrame: 0.33)    loader.runAction(SKAction.scaleBy(0.25,duration: 0))    loader.zposition = 100    loader.runAction(SKAction.repeatActionForever(animation))    loader.position = CGPointMake(self.size.wIDth/2,self.size.height/2)    self.addChild(loader)}func start(){    self.loadCount = self.loadCount + 1}func end(){    self.loadCount = self.loadCount - 1}}

来自GameScene的代码:

func setEverythingUp(myLoadingScene: LoadingScene){    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()    var ID = 0    if let tempID = defaults.objectForKey("UserID") as? Int {       ID = tempID    }else{        print("newUser")        defaults.setobject(0,forKey: "UserID")        defaults.synchronize()    }    self.mySettings = Settings(UserID: ID)    self.myURLRequests = URLRequests(thesettings: self.mySettings)    ///////////call back system here,start() increments number of tasks waiting to finish,end() means a task is finished    myLoadingScene.start()    myURLRequests.getFleet(self,UserID: self.mySettings.UserID,enemy: false){ () -> () in        myLoadingScene.end()    }    myLoadingScene.start()    myURLRequests.getFleet(self,enemy: true){ () -> () in        myLoadingScene.end()    }    self.backgroundcolor = SKcolor.blackcolor()    self.physicsWorld.contactDelegate = self    self.physicsWorld.gravity = CGVector(dx: 0,dy: 0)    addStars()    self.anchorPoint = CGPoint(x:self.size.wIDth/2,y:self.size.height/2)    self.myCamera.position = CGPointMake(200,0)    self.addChild(self.myCamera)    self.camera = self.myCamera    self.myAnchor.position = self.myCamera.position}overrIDe func dIDMovetoVIEw(vIEw: SKVIEw) {    print("in vIEw")    let pinch = UIPinchGestureRecognizer(target: self,action: Selector("PinchScale:"))    let tap = UITapGestureRecognizer(target: self,action: Selector("Tap:"))    let pan = UIPanGestureRecognizer(target: self,action: Selector("DragMove:"))    self.vIEw?.addGestureRecognizer(pinch)    self.vIEw?.addGestureRecognizer(tap)    self.vIEw?.addGestureRecognizer(pan)    let firebutton = UIbutton(type: .System)    firebutton.setTitle("Fire!",forState: UIControlState.normal)    firebutton.TitleLabel!.Font = UIFont(name: "TrebuchetMS",size: 70)    firebutton.sizetoFit()    firebutton.frame = CGRect(x: self.size.wIDth*0.5 - 80,y: 20,wIDth: self.size.wIDth*0.3,height: 30)    firebutton.addTarget(self,action: Selector("FirebuttonClicked"),forControlEvents: UIControlEvents.touchUpInsIDe)    self.vIEw?.addSubvIEw(firebutton)    let alternateControls = false    let AngleLabel = UILabel()    AngleLabel.text = "Angle"    AngleLabel.Font = UIFont(name: "TrebuchetMS",size: 30)    AngleLabel.textcolor = UIcolor.bluecolor()    let AngleSlIDer = UiSlider()    AngleSlIDer.addTarget(self,action: Selector("AngleSlIDed:"),forControlEvents: UIControlEvents.ValueChanged)    AngleSlIDer.maximumValue = 90    AngleSlIDer.minimumValue = -90    AngleSlIDer.value = 0    AngleSlIDer.continuous = true    let PowerLabel = UILabel()    PowerLabel.text = "Power"    PowerLabel.Font = UIFont(name: "TrebuchetMS",size: 30)    PowerLabel.textcolor = UIcolor.bluecolor()    let PowerSlIDer = UiSlider()    PowerSlIDer.addTarget(self,action: Selector("PowerSlIDed:"),forControlEvents: UIControlEvents.ValueChanged)    PowerSlIDer.maximumValue = 0.99    PowerSlIDer.minimumValue = 0.1    PowerSlIDer.value = 0.5    PowerSlIDer.continuous = true    if alternateControls{        AngleLabel.frame = CGRect(x: self.size.wIDth*0.05,y: 10,height: 60)        AngleSlIDer.frame = CGRect(x: self.size.wIDth * -0.05,y: self.size.height*0.55,wIDth: self.size.height*0.7,height: 30)        AngleSlIDer.transform = CGAffinetransformMakeRotation(CGfloat(M_PI) * 1.5)        PowerLabel.frame = CGRect(x: self.size.wIDth*0.7,height: 60)        PowerSlIDer.frame = CGRect(x: self.size.wIDth * 0.65,height: 30)        PowerSlIDer.transform = CGAffinetransformMakeRotation(CGfloat(M_PI) * 1.5)    }else{        AngleLabel.frame = CGRect(x: self.size.wIDth*0.21,y: self.size.height-80,height: 60)        AngleSlIDer.frame = CGRect(x: self.size.wIDth * 0.025,y: self.size.height-30,wIDth: self.size.wIDth*0.45,height: 30)        PowerLabel.frame = CGRect(x: self.size.wIDth*0.71,height: 60)        PowerSlIDer.frame = CGRect(x: self.size.wIDth * 0.525,height: 30)    }    self.vIEw?.addSubvIEw(AngleLabel)    self.vIEw?.addSubvIEw(AngleSlIDer)    self.vIEw?.addSubvIEw(PowerLabel)    self.vIEw?.addSubvIEw(PowerSlIDer)}
解决方法 你这样做:
myURLRequests.getFleet(self,enemy: false){ () -> () in    myLoadingScene.end()}

一旦URL请求完成,可能会在后台线程上调用myLoadingScene.end(). end设置loadCount,它有一个启动新视图的setter,self.vIEw?.presentScene(newScene)

这是需要在主线程上运行的最后一块.

假设你有一个方便的函数来在主线程上运行一些东西:

func on_main_async (closure:()->()) {    dispatch_async(dispatch_get_main_queue()) {        closure()    }}

然后您可以将场景演示代码更改为

on_main_async() { self.vIEw?.presentScene(newScene) }

应该做的伎俩.

总结

以上是内存溢出为你收集整理的ios – SpriteKit在转换到新场景时收到有关UIElements的错误全部内容,希望文章能够帮你解决ios – SpriteKit在转换到新场景时收到有关UIElements的错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1099374.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存