我需要一些帮助来确定此代码中的问题。我想我想在这里做些愚蠢的事情。我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用swift委托,以便成功加载广告后,可以在主类中调用该函数以显示广告。我在这里面临的问题是未调用此广告类的实际委托方法(bannerDidFinishLoading,didFailToLoadWithError ...)。我认为在方法返回后将其释放,这就是为什么未调用委托方法的原因。如果您注意到在日志中,则没有从广告类中调用横幅广告的委托,但是日志确实显示广告已成功获取并加载。
任何帮助将不胜感激。预先感谢。
advertise.swift:
import UIKit
import InMobiSDK
import AdSupport
let INMOBI_BANNER_PLACEMENT2: Int64 = 111111111
protocol bannerViewDelegate:class {
func bannerViewCalled(banner: IMBanner?)
}
class advertisement: UIViewController, IMBannerDelegate {
var banner: IMBanner?
weak var delegatex: bannerViewDelegate?
func loadBanner() {
print ("Inside Load")
banner = IMBanner.init(frame: CGRect(x: 0, y: 0, width: 320, height: 50), placementId: INMOBI_BANNER_PLACEMENT2)
banner?.delegate = self
banner?.load()
banner?.shouldAutoRefresh(true)
banner?.refreshInterval = 45
}
deinit {
print("Deinit Called")
}
public func bannerDidFinishLoading(_ banner: IMBanner!) {
print("bannerDidFinishLoading")
delegatex?.bannerViewCalled(banner: banner!)
}
public func banner(_ banner: IMBanner!, didFailToLoadWithError error: IMRequestStatus!) {
print("didFailToLoadWithError")
}
public func bannerWillPresentScreen(_ banner: IMBanner!) {
print("bannerWillPresentScreen")
}
public func bannerDidPresentScreen(_ banner: IMBanner!) {
print("bannerDidPresentScreen")
}
public func bannerWillDismissScreen(_ banner: IMBanner!) {
print("bannerWillDismissScreen")
}
public func bannerDidDismissScreen(_ banner: IMBanner!) {
print("bannerDidDismissScreen")
}
}
主类调用广告类:
import UIKit
import InMobiSDK
import AdSupport
class sample: UIViewController, bannerViewDelegate, IMBannerDelegate {
var bannerx: IMBanner?
override func viewDidLoad() {
super.viewDidLoad()
//bannerx?.delegate = self
print("before call")
let obj1 = advertisement()
obj1.delegatex = self
obj1.loadBanner()
print("after call")
}
func bannerViewCalled(banner: IMBanner?) {
print("return delegate")
let tabBar_MinY: CGFloat! // Starting poition of tab bar
tabBar_MinY = self.tabBarController?.tabBar.frame.minY
let adView = UIView()
adView.frame = CGRect(x: 0, y: tabBar_MinY - 50, width: self.view.bounds.width, height: 50)
bannerx = banner
adView.addSubview(bannerx!)
self.view.addSubview(adView)
}
}
登录控制台:
before call
Inside Load
after call
[InMobi] | 2020.01.26 12:37:34.147 | 1004 | Fetching banner ad for placement id: 111111111
Deinit Called
[InMobi] | 2020.01.26 12:37:34.926 | 1001 | Loading Banner ad for placement id: 111111111
[InMobi] | 2020.01.26 12:37:34.929 | 1001 | Banner ad successfully fetched for placement id: 111111111
[InMobi] | 2020.01.26 12:37:34.998 | 1001 | Started loading Banner ad markup in the webview for placement id: 111111111
[InMobi] | 2020.01.26 12:37:35.563 | 1001 | Successfully loaded Banner ad markup in the webview for placement id: 111111111
[基本上,我们有一个基本屏幕,它将等待我们的选择或命令,还有一个选择屏幕,我们在该屏幕上下达订单。
我们创建了一个仅带有函数声明的协议,它将在选择屏幕中调用,并在基本屏幕中实现!
让我们改变主屏幕的颜色。
protocol ColorChangeDelegate {
func didChooseColor(color: UIColor)
}
我们的主屏幕,即基本屏幕,将符合该委托协议并实现功能。
extension BaseScreen: ColorChangeDelegate {
func didChooseColor(color: UIColor) {
view.backgroundColor = color
}
}
因此,当基本屏幕将显示选择视图控制器时,它将自己设置为其委托!
class BaseScreen: UIViewController {
@IBOutlet weak var chooseButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func chooseButtonTapped(_ sender: UIButton) {
let selectionVC = storyboard?.instantiateViewController(withIdentifier: "SelectionScreen") as! SelectionScreen
selectionVC.colorDelegate = self
present(selectionVC, animated: true, completion: nil)
}
}
选择屏幕将在点击按钮但未实现时将调用委托函数:
class SelectionScreen: UIViewController {
var colorDelegate: ColorChangeDelegate!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func redButtonTapped(_ sender: UIButton) {
colorDelegate.didChooseColor(color: .red)
dismiss(animated: true, completion: nil)
}
@IBAction func blueButtonTapped(_ sender: UIButton) {
colorDelegate.didChooseColor(color: .blue)
dismiss(animated: true, completion: nil)
}
}
我希望这个简单的例子可以使事情更清楚!