我已将admob奖励视频添加到我的应用中。一切都很好用admob。但是,观看奖励视频后,我无法更新实时标签。如果我去另一个场景并回来,它会更新并显示新值。
// GameViewController.swift
func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
didRewardUserWith reward: GADAdReward) {
print("Reward received with currency: \(reward.type), amount \(reward.amount).")
GameData.shared.lives = GameData.shared.lives + 1
UserDefaults.standard.set(GameData.shared.lives, forKey: "lives")
UserDefaults.standard.synchronize()
}
// MainScene.swift
var lives = UserDefaults.standard.integer(forKey: "lives") {
didSet{
livesLabel?.text = "\(lives)"
}
}
//
答案 0 :(得分:2)
有几种方法可以做到。
您可以设置通知和观察者,以便在值发生变化时触发,然后相应地调整标签。
您可以使用协议,但我认为这种情况过于复杂。
最简单的方法是在实例化GameViewController时将MainScene
的变量存储起来。
private var mainScene: MainScene!
// Load the SKScene from MainScene.sks'
mainScene = MainScene(fileNamed: "MainScene")
mainScene.scaleMode = .aspectFill
self.view?.presentScene(mainScene, transition)
如果您没有在场景编辑器中创建相应的SKS文件,而是通过代码使用加载场景......
//load the mainScene using init created in code
mainScene = MainScene(size: self.view?.bounds.size)
mainScene.scaleMode = .aspectFill
self.view?.presentScene(mainScene, transition)
现在,当您想要从GameViewController引用该场景时,只需使用
GameData.shared.lives += 1
mainScene.lives = GameData.shared.lives
答案 1 :(得分:2)
我个人的建议是通过计算属性与场景建立连接:
class ViewController : UIViewController
{
var mainScene : MainScene? { return (self.view as SKView?).scene as? MainScene}
var lives : Int
{
get
{
return mainScene?.lives ?? 0
}
set
{
mainScene?.lives = newValue
//perhaps do some error handling if mainscne is nil
}
}
}
然后在您的主场景中,您可以控制生命写入userdefaults的方式
class MainScene : SKScene
{
private var _lives : Int?
var lives : Int
{
get
{
_lives = _lives ?? UserDefaults.standard.integer(forKey: "lives")
return _lives!
}
set
{
_lives = newValue
UserDefaults.standard.set(_lives, forKey: "lives")
UserDefaults.standard.synchronize()
livesLabel?.text = "\(_lives)"
}
}
}
最后要使用它,你会这样做:
func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
didRewardUserWith reward: GADAdReward) {
print("Reward received with currency: \(reward.type), amount \(reward.amount).")
lives += 1
}
然后我们可以避免处理全局变量,这意味着错误和错误的机会减少