如何从 Swift 中另一个 class 中的侦听器调用 SKScene 中的方法?

How To invoke method in SKScene from a listener in another class in Swift?

我有一个单独的 class 来处理我的 adMob 代码。 在这个 class 中,我有所有的侦听器方法,例如:

func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) {...}

在我的 SKScene 中,我提供了 RewardedAds,我还需要一个方法,当 rewardBasedVideoAd 方法被调用时,该方法将被调用。

我试过这样实现 delegate 方式: 在 AdsManager class:

protocol Ads_Rewarded_SupportDelegate: class{
func rewardedFinishSuccessfuly()
func rewardedAdClosed()}

并且在 Ads_Rewarded_Support 我添加了:

weak var delegate: Ads_Rewarded_SupportDelegate?

func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) {
 delegate?.rewardedFinishSuccessfuly()}

在我的 SKScene 中:

class GameScene: SKScene, Ads_Rewarded_SupportDelegate { 
private let rewardedAd = Ads_Rewarded_Support()
rewardedAd.delegate = self

最终:

func rewardedFinishSuccessfuly() {
   print("rewarded Finish Successfuly")
}

但我仍然无法调用此 rewardedFinishSuccessfuly 方法。 当调用 rewardBasedVideoAd 时,如何在 SKScene 中调用我的方法?

如果对项目有帮助,link: project on Github

编辑: 当我从应该激活委托方法的 GameScene 手动方法调用时,它起作用了。所以我的问题在pointer。它没有保持实例的活动状态,所以当 didRewardUserWith 被调用时,我的 GameScene 不再是委托。 知道如何解决这个问题吗?

您对 Ads_Rewarded_SupportDelegate 的实施很好。

您遇到的问题是因为 reward based video ad fails to load

因此,不会调用以下内容:

func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward)
func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd)

检查您的控制台日志,您会看到:

You are currently using version 7.25.0 of the SDK. 
Please consider updating your SDK to the most recent SDK version 
to get the latest features and bug fixes.

Error Domain=com.google.ads Code=1 "Request Error: No ad to show."
UserInfo={NSLocalizedDescription=Request Error: No ad to show.,
NSLocalizedFailureReason=Request Error: No ad to show.}

我会按照这里的建议去做。希望这能解决您遇到的问题!

有效! 问题是我指向 AdsSupport class 的指针不存在。 我补充说: return Ads_Rewarded_Support.rewardedAdsPointer! 并调用广告:

rewardedAd = Ads_Rewarded_Support().presentRewardAdFor(scene: self)

然后我将委托设置为自己。 感谢您尽最大努力帮助我处理这个令人头疼的案子。