Objective c SWIFT-代表和协议
我需要一些帮助来识别代码中的问题。我想我是在做一些傻事。 我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用swift委托,以便在成功加载广告时,可以调用主类中的函数来显示广告。我在这里面临的问题是没有调用此播发类的实际委托方法(bannerDidFinishLoading、didFailToLoadWithError…)。我认为它是在方法返回后被解除分配的,这就是为什么没有调用委托方法。 如果您注意到,在日志中,没有从广告类调用横幅广告的代理,但是日志确实显示广告已成功获取和加载 任何帮助都将不胜感激。提前谢谢 www.swift:Objective c SWIFT-代表和协议,objective-c,swift,delegates,Objective C,Swift,Delegates,我需要一些帮助来识别代码中的问题。我想我是在做一些傻事。 我正在创建一个类(广告类),它将在我的应用程序中加载广告。我正在尝试使用swift委托,以便在成功加载广告时,可以调用主类中的函数来显示广告。我在这里面临的问题是没有调用此播发类的实际委托方法(bannerDidFinishLoading、didFailToLoadWithError…)。我认为它是在方法返回后被解除分配的,这就是为什么没有调用委托方法。 如果您注意到,在日志中,没有从广告类调用横幅广告的代理,但是日志确实显示广告已成功获
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。。。我想学习,所以我以后不会犯类似的错误。如果你定义一个函数的局部变量,你不能依赖它在函数结束后的存在。只要对象/(实例)存在,实例变量就会持续。因为您是以委托的形式提供它的,所以在加载视图后,您需要它留在周围。(代表通常被视为弱引用。)