【发布时间】:2021-12-24 19:09:23
【问题描述】:
我在让 Admob 横幅的简单 UI 使用 swiftUI 和视图控制器工作时遇到问题。
控制器:
import UIKit
import Foundation
import GoogleMobileAds
import ToastViewSwift
public class AdsScreenViewController: UIViewController, GADBannerViewDelegate {
var auID = ""
init (auID: String){
self.auID = auID
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func viewDidLoad() {
super.viewDidLoad()
var bannerView: GADBannerView!
bannerView = GADBannerView(adSize: kGADAdSizeBanner)
addBannerViewToView(bannerView)
bannerView.adUnitID = auID
bannerView.rootViewController = self
bannerView.load(GADRequest())
bannerView.delegate = self
}
func addBannerViewToView(_ bannerView: GADBannerView) {
bannerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(bannerView)
view.addConstraints(
[NSLayoutConstraint(item: bannerView,
attribute: .bottom,
relatedBy: .equal,
toItem: bottomLayoutGuide,
attribute: .top,
multiplier: 1,
constant: 0),
NSLayoutConstraint(item: bannerView,
attribute: .centerX,
relatedBy: .equal,
toItem: view,
attribute: .centerX,
multiplier: 1,
constant: 0)
])
}
public func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
print("bannerViewDidReceiveAd")
}
public func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
print("bannerView:didFailToReceiveAdWithError: \(error.localizedDescription)")
}
public func bannerViewDidRecordImpression(_ bannerView: GADBannerView) {
print("bannerViewDidRecordImpression")
}
public func bannerViewWillPresentScreen(_ bannerView: GADBannerView) {
print("bannerViewWillPresentScreen")
}
public func bannerViewWillDismissScreen(_ bannerView: GADBannerView) {
print("bannerViewWillDIsmissScreen")
}
public func bannerViewDidDismissScreen(_ bannerView: GADBannerView) {
print("bannerViewDidDismissScreen")
}
}
Swift 用户界面:
import SwiftUI
import UIKit
struct TestAdsView: View {
@State private var auID = ""
@State private var auType = 1
@State private var isPresented = false
var body: some View {
List {
VStack(alignment: .leading, content: {
Text("AdUnit")
.font(.footnote).fontWeight(.medium)
TextField("adunitid", text: $auID)
.font(.headline)
})
VStack(alignment: .leading, content: {
Button(action: {
self.auID = auID
}, label: {
HStack {
Text("Show Ad")
}
})
BannerViewController(auID: auID)
}
)}
}
struct TestAdsView_Previews: PreviewProvider {
static var previews: some View {
TestAdsView()
}
}
struct BannerViewController: UIViewControllerRepresentable {
var auID: String
public typealias UIViewControllerType = UIViewController
func makeUIViewController(context: UIViewControllerRepresentableContext<BannerViewController>) -> BannerViewController.UIViewControllerType {
return AdsScreenViewController(auID: auID)
}
func updateUIViewController(_ uiViewController: BannerViewController.UIViewControllerType, context: UIViewControllerRepresentableContext<BannerViewController>) {
let controller = AdsScreenViewController(auID: auID)
controller.auID = self.auID
}
}
一切编译正常,运行时显示 TextView。但是当输入 id 时它没有调用bannerView.load,我认为 UIViewControllerRepresentable 会像视图上的侦听器一样自动更新,应该调用它但什么都没有发生。
【问题讨论】:
-
@loremipsum 已经尝试了两天,试图让它与 Admob 回调一起工作。尝试了大多数这些链接并到达了这里。对ios开发不是很熟悉,只需要一些指导就可以了。谢谢
-
为什么会这样?输入 id 时,您的代码的哪一部分应该调用
load?到目前为止,它只在viewDidLoad时调用,所以你调用它一次,id 为空。 -
另外,您不应该尝试更换
updateUIViewController和make上的控制器,然后在其余时间更新或调用方法。 SO中有很多关于如何实施谷歌广告的例子。 -
如果您在
BannerViewController中将var auID: String替换为@Binding var auID: String,您可能会使其正常工作,但您可能会被Google 标记,因为您将重新创建广告的次数过多。因为let controller = AdsScreenViewController(auID: auID)onupdateUIViewController
标签: ios swift uiviewcontroller admob