Лист не закрывается в режиме презентации в SwiftUI / UIKit? - PullRequest
1 голос
/ 17 июня 2020

У меня есть представление SwiftUI, которое отображает лист с использованием переменной @State:

    import SwiftUI

struct AdRevenue: View {
    @State var playAd = false
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

var body: some View {
    Button(action: {
            self.playAd = true
                    })
            {
                Text("Play Ad")
            }.sheet(isPresented: $playAd) {
                Ads()}
}
}

Это лист UIViewRepresentable:

  struct Ads: UIViewControllerRepresentable {

@Environment(\.presentationMode) var presentationMode

typealias UIViewControllerType = UIViewController


func makeUIViewController(context: Context) -> UIViewController {
    return ViewController()
}

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

class ViewController: UIViewController, GADRewardedAdDelegate, AdManagerRewardDelegate {

var rewardedAd: GADRewardedAd?

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

override func viewDidLoad() {
super.viewDidLoad()

    AdManager.shared.loadAndShowRewardAd(AdIds.rewarded.rawValue, viewController: self)
    AdManager.shared.delegateReward = self    
    }


    func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
      print("Reward received: \(reward.type), amount \(reward.amount).")
    }

}
}

В AdManager функция вызывается как например:

    func rewardAdDidClose() {

    let mom = Ads()

    mom.presentationMode.wrappedValue.dismiss()
    print("mom.presentationMode.wrappedValue.dismiss()")
}

Тем не менее, хотя я вижу сообщение presentationMode, когда запускаю его, лист не закрывается. Можно ли так закрыть лист?

1 Ответ

0 голосов
/ 29 июля 2020

Это потому, что у вас есть два значения Ads?

Первое создается SwiftUI (внутри представления AdRevenue), поэтому его свойство presentationMode, вероятно, будет правильно подключено к среды приложения.

Но позже, в пределах AdManager, вы создаете другое значение Ads и ожидаете, что оно будет иметь пригодный для использования объект среды presentationMode. Он создается вне SwiftUI, поэтому не может знать о среде остальной части вашего приложения.

Я бы попытался передать значение Ads в ваш AdManager, вместо того, чтобы AdManager создать новый.

...