Как исправить ошибку в коде, чтобы не ругался xcode?

Рейтинг: 0Ответов: 1Опубликовано: 25.03.2023

Написал следующий код для интеграции полноэкранной рекламыв приложение ios. Xcode выдает ошибку: Type 'YandexInter' does not conform to protocol 'UIViewControllerRepresentable'

Как ее исправить? Подскажите, пожалуйста. Вот код:

struct YandexInter : UIViewControllerRepresentable {
    
   typealias UIViewControllerType = YMAInterstitialAd
    
   func makeUIViewController(context: Context) -> YMAInterstitialAd
        {
            
            let adViewAdIn = YMAInterstitialAd(adUnitID: "R-M-2248734-1")
            
            adViewAdIn.delegate = context.coordinator

            adViewAdIn.load()

            return adViewAdIn
        }

        func updateUIViewController(_ uiView: YMAInterstitialAd, context: Context) {}

        func makeCoordinator() -> Coordinator
        {
            Coordinator()
        }

    class Coordinator: NSObject, YMAInterstitialAdDelegate
    {
        var interstitialYandexAd: YMAInterstitialAd!
        
        func loadInterstitial(){
                //self.interstitialYandexAd = YMAInterstitialAd(adUnitID: "R-M-2248734-1")
                //self.interstitialYandexAd?.load()
                self.interstitialYandexAd.delegate = self
            }
        
        func interstitialAdDidLoad(_ interstitialYandexAd: YMAInterstitialAd) {
      
            let scenes = UIApplication.shared.connectedScenes
            let windowScene = scenes.first as? UIWindowScene
            let window = windowScene?.windows.first
            let root = window?.rootViewController
          
            self.interstitialYandexAd.present(from: root!)
          
            print("Loaded Adv.")
              
        }
        
        func interstitialAdDidFail(toLoad interstitialYandexAd: YMAInterstitialAd, error: Error) {
            
            print("Loading failed. Error: \(error)")
        }
         
         func interstitialAdDidFail(toPresent interstitialAd: YMAInterstitialAd, error: Error) {
             print("Presenting failed. Error: \(error)")
             
         }

    }
}

Ответы

▲ 1Принят

Посмотрел фреймворк YandexMobileAds, сущность YMAInterstitialAd не является вьюконтроллером, поэтому метод makeUIViewController возвращает неправильный тип и из-за этого YandexInter не конформит протокол UIViewControllerRepresentable. Как вариант, вы можете сделать свой вьюконтроллер:

import SwiftUI
import YandexMobileAds

struct ContentView: View {

    var body: some View {
        AdView()
    }
}

struct AdView: UIViewControllerRepresentable {

    func makeUIViewController(context: Context) -> InterstitialViewController {
        InterstitialViewController()
    }

    func updateUIViewController(_ uiViewController: InterstitialViewController, context: Context) {}
}

class InterstitialViewController: UIViewController {

    private var iAd: YMAInterstitialAd?

    override func viewDidLoad() {
        super.viewDidLoad()

        iAd = YMAInterstitialAd(adUnitID: "demo-interstitial-yandex")
        iAd?.delegate = self;
        iAd?.load()
    }
}

extension InterstitialViewController: YMAInterstitialAdDelegate {
    func interstitialAdDidLoad(_ interstitialAd: YMAInterstitialAd) {
        iAd?.present(from: self)
        print("Ad loaded")
    }
}