【问题标题】:Sheet not dismissing with presentation mode in SwiftUI/UIKit?在 SwiftUI/UIKit 中,工作表没有以演示模式关闭?
【发布时间】:2020-10-07 14:47:16
【问题描述】:

我有一个使用@State 变量显示工作表的 SwiftUI 视图:

    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 消息,但工作表并没有被关闭。是否可以像这样关闭工作表?

【问题讨论】:

  • 尝试将演示模式传递给工作表中的广告:Ad().environment(\.presentationMode, self.presentationMode)
  • @BokuWaTaka 我收到错误消息:“键路径值类型 'WritableKeyPath>' 无法转换为上下文类型 'KeyPath>'”

标签: ios swift uikit swiftui modalviewcontroller


【解决方案1】:

这是因为您有两个 Ads 值吗?

第一个是由 SwiftUI 创建的(在 AdRevenue 视图内),因此它的 presentationMode 属性很可能已正确连接到应用程序的环境。

但稍后,在AdManager 中,您将创建另一个Ads 值,并期望它具有可用的presentationMode 环境对象。它是在 SwiftUI 之外创建的,因此无法了解应用程序其余部分的环境。

我会尝试将Ads 值传递给您的AdManager,而不是让AdManager 创建一个新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多