如何在仅 SwiftUI 的项目中正确呈现 PKPaymentAuthorizationViewController?

Posted

技术标签:

【中文标题】如何在仅 SwiftUI 的项目中正确呈现 PKPaymentAuthorizationViewController?【英文标题】:How to properly present PKPaymentAuthorizationViewController in a SwiftUI only project? 【发布时间】:2020-06-29 12:41:51 【问题描述】:

我已经访问过这个答案并且the present method proposed here 不起作用(不再起作用了?)。当我使用 UIViewControllerRepresentable 然后将其显示为工作表时,它看起来非常糟糕:

如果我使用overlay,它看起来就像我想要的那样,但overlay 不能从Button 触发。

这是(精简的)代码:

public struct ContentView: View 
    @ObservedObject var model: RootViewModel
    @State private var tappedDonate = false

    public var body: some View 
            Button(action: 
                tappedDonate = true
            , label: 
                Text("Donate")
                    .frame(width: 300, height: 44, alignment: .center)
            )
            .frame(width: 300, height: 20, alignment: .center)
            .padding()
            .background(Color.black)
            .foregroundColor(.white)
            .cornerRadius(22)
            .sheet(isPresented: $tappedDonate) 
                ApplePayWrapper(request: model.buildApplePayment())
                    .background(Color.clear)
            
    

    public init(model: RootViewModel) 
        self.model = model
    

【问题讨论】:

您是否找到了更好的方法来做到这一点,即使在 SwiftUI 2 中也是如此?仍然没有这方面的文档或示例。 嗨@TruMan1 不,我没有,我已经放弃了这个项目,因为现在生活中同时发生了太多事情。如果您找到更好的解决方案,请告诉我 【参考方案1】:

我不是 100% 相信这是最好的方法,但我设法让它在视觉上像我打算使用 ZStack 一样工作:


        ZStack            
            Button(action: 
                tappedDonate = true
            , label: 
                Text("Donate")
                    .frame(width: 300, height: 44, alignment: .center)
            )
            .frame(width: 300, height: 20, alignment: .center)
            .padding()
            .background(Color.black)
            .foregroundColor(.white)
            .cornerRadius(22)
            if tappedDonate 
                ApplePayWrapper(request: model.buildApplePayment())
            
        

请注意,您仍然需要通过代理点击外部来连接取消按钮以及常规关闭,否则带有按钮的底层 UI 不会再次响应触摸。

【讨论】:

我也遇到了确切的问题。通过 ZStack 处理它的好发现。肯定有内存泄漏的地方。当我手动 nil 退出 PK 控制器实例时,它工作得更好,但仍然不稳定。之后我可以一次又一次地打开它,但取消按钮仍然不起作用,而且事件非常不稳定。

以上是关于如何在仅 SwiftUI 的项目中正确呈现 PKPaymentAuthorizationViewController?的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥

在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥

SwiftUI:如何使用语义放置呈现多个 ToolbarItem?

SwiftUI 没有使用 List 和 TabView 正确处理 @State

SwiftUI 列表未使用 ForEach 正确更新

从公共 API 获取 JSON 以在 SwiftUI 的列表视图中呈现