Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c SWIFT-代表和协议_Objective C_Swift_Delegates - Fatal编程技术网

Objective c SWIFT-代表和协议

Objective c SWIFT-代表和协议,objective-c,swift,delegates,Objective C,Swift,Delegates,我需要一些帮助来识别代码中的问题。我想我是在做一些傻事。 我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用swift委托,以便在成功加载广告时,可以调用主类中的函数来显示广告。我在这里面临的问题是没有调用此播发类的实际委托方法(bannerDidFinishLoading、didFailToLoadWithError…)。我认为它是在方法返回后被解除分配的,这就是为什么没有调用委托方法。 如果您注意到,在日志中,没有从广告类调用横幅广告的代理,但是日志确实显示广告已成功获

我需要一些帮助来识别代码中的问题。我想我是在做一些傻事。 我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用swift委托,以便在成功加载广告时,可以调用主类中的函数来显示广告。我在这里面临的问题是没有调用此播发类的实际委托方法(bannerDidFinishLoading、didFailToLoadWithError…)。我认为它是在方法返回后被解除分配的,这就是为什么没有调用委托方法。 如果您注意到,在日志中,没有从广告类调用横幅广告的代理,但是日志确实显示广告已成功获取和加载

任何帮助都将不胜感激。提前谢谢

www.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

将obj1=advision()移出
viewDidLoad
方法,并将其作为实例变量(如
bannerx
)。@PhillipMills——它确实起作用了。我将其从viewDidLoad中移出,并将其作为一个实例变量(让obj1=advision())。。。非常感谢。你能让我知道这两个之间的区别是什么,为什么它不工作,当我在viewDidLoad。。。我想学习,所以我以后不会犯类似的错误。如果你定义一个函数的局部变量,你不能依赖它在函数结束后的存在。只要对象/(实例)存在,实例变量就会持续。因为您是以委托的形式提供它的,所以在加载视图后,您需要它留在周围。(代表通常被视为弱引用。)