SWIFT-委托和协议

问题描述 投票:0回答:1

我需要一些帮助来确定此代码中的问题。我想我想在这里做些愚蠢的事情。我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用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
objective-c swift delegates
1个回答
0
投票

Swift中的委托模式

很容易解释

[基本上,我们有一个基本屏幕,它将等待我们的选择或命令,还有一个选择屏幕,我们在该屏幕上下达订单。

我们创建了一个仅带有函数声明的协议,它将在选择屏幕中调用,并在基本屏幕中实现!

让我们改变主屏幕的颜色。

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)
    }
}

我希望这个简单的例子可以使事情更清楚!

© www.soinside.com 2019 - 2024. All rights reserved.