【问题标题】:Swift: About Protocols and Delegation patternSwift:关于协议和委托模式
【发布时间】:2016-06-16 00:49:14
【问题描述】:

我想问一下协议和委托模式在 Swift 中是如何工作的。

我有一个应用程序可以让我在 iOS 平台上试用 google ad sdk。但我遗漏了一些东西,并对这些方法的工作原理感到困惑。

我有一些这样的代码;

import UIKit
import GoogleMobileAds

class ViewController: UIViewController, GADInterstitialDelegate {

@IBOutlet weak var bannerView: GADBannerView!
let request = GADRequest()
var interstitial: GADInterstitial!

@IBOutlet weak var mylbl: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    bannerView.adUnitID = "xxx"
    bannerView.rootViewController = self
    bannerView.loadRequest(self.request)
    interstitial = createAndLoadInterstitial()
}

func createAndLoadInterstitial() -> GADInterstitial {
    let interstitial = GADInterstitial(adUnitID: "xxx")
    interstitial.delegate = self
    interstitial.loadRequest(self.request)
    return interstitial
}

func interstitialDidDismissScreen(ad: GADInterstitial!) {
    interstitial = createAndLoadInterstitial()
    mylbl.text = "No ad"

}

func interstitialDidReceiveAd(ad: GADInterstitial!) {
    mylbl.text = "received ad"
}

@IBAction func touched(sender: AnyObject) {

    if interstitial.isReady
    {
        interstitial.presentFromRootViewController(self)
    }
    else
    {
        mylbl.text = "Not Ready!"
    }
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

对于上面的代码,我知道采用类或结构或枚举的方法和属性的协议蓝图。协议中定义的方法或属性应在相关委托采用的类上实现。

我想问这个问题和困惑点:好的,从委托“GADInsterstitialDelegate”继承的名为“interstitialDidDismissScreen”的方法,但是如何通过按下插页式广告的关闭按钮来处理该方法。 Google 的工程师在哪里实施以及他们如何成功实现这种行为。感谢您的帮助。

好技巧,

【问题讨论】:

    标签: ios objective-c swift design-patterns delegates


    【解决方案1】:

    按钮处理发生在GADInterstitial 类中。当他们设置类时,他们可能有一些内部方法来处理所有广告交互,然后使用委托方法将您需要知道的信息发送回您的类,以保持您的 UI 得到管理。通过实现委托及其方法,您说过我想使用您的班级所做的事情,然后我还想处理来自该班级的所有反馈。如果您要创建自己的类并实现协议和委托,您可以在类中做任何您想做的事情,然后只将一小部分信息传递给类的委托。一个例子是条形码阅读类。我不在乎如何读取条形码,我只想知道代码,所以我可以将我的调用类设置为条形码读取类的代表,当条形码被读取时,我会在条形码委托方法。

    【讨论】:

    • 天啊!这个答案更聪明、更开放、更不稳定。您的条形码示例非常好。感谢您的宝贵回答!我完全明白我所缺少的和重点是什么!我认为这个想法使我们的对象或类与其他对象或类保持抽象。我认为也是一个很好的抽象模式。所以准确地说,AdMob SDK 的代码是封闭的,对吧?而且我们看不到班级做了什么。它只是给我们一个端点并使用输出。完美的。非常感谢。
    【解决方案2】:

    您问题的措辞是乱码,难以理解。

    协议基本上是一份合同。它表示符合协议的对象承诺提供属性,并响应协议定义的方法。

    当你说

    someObject.delegate = self
    

    你将一个指向你自己的指针传递给另一个对象。这就像给某人您的电话号码并说“请帮我处理这些差事。如果您有任何问题,请拨打这个号码给我。也请在完成差事后给我打电话。”

    由于另一个对象知道它的委托符合特定协议,它知道它可以通过电话发送什么消息(它可以发送什么消息给委托)

    我怀疑interstitialDidReceiveAd(ad: GADInterstitial!) 和interstitialDidDismissScreen(ad: GADInterstitial!) 方法是委托方法。

    当interstitial 对象需要向它的委托发送消息时,它会调用这些方法。

    【讨论】:

    • 感谢您的回答。你是对的,我对你的回答很满意。当我浏览 Interstitial 对象时,一些注释行证实了这个想法; "/// 如果插页式广告已准备好显示,则返回 YES。委托的 /// interstitialAdDidReceiveAd: 将在此属性从 NO 切换为 YES 后调用。"
    • 对。委托设计模式在整个 Cocoa 中都使用,并且在 Mac 和 iOS 上的 Objective-C 和 Swift 中都使用。我已经使用了 10 多年,所以我 100% 确定我说的是真的。
    • 哇,多么棒的体验:+10 年。感谢您的评论:)
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多