如何在SwiftUI中通过UIViewControllerRepresentable使用PKAddPassesViewController并解决关闭问题
问题根源
你当前的实现有两个核心问题:
PKAddPassesViewControllerDelegate回调中的绑定值赋值逻辑错误,没有触发状态变化- 给
Binding附加onChange的写法不符合SwiftUI规范,监听逻辑没有生效
修正方案
你可以直接去掉多余的中间done变量,把控制导航显隐的状态直接传入PassKit结构体,回调里直接修改显隐状态即可,完整修正代码如下:
1. 修正PassKit实现
import PassKit import SwiftUI struct PassKit: UIViewControllerRepresentable { // 直接绑定控制页面显隐的状态变量 @Binding var isPresented: Bool var pass: PKPass class Coordinator: NSObject, PKAddPassesViewControllerDelegate { var parent: PassKit init(_ parent: PassKit) { self.parent = parent } // 点击Add/Cancel都会触发该回调 func addPassesViewControllerDidFinish(_ controller: PKAddPassesViewController) { // 直接把显隐状态置为false,触发导航自动返回 parent.isPresented = false } } func makeCoordinator() -> Coordinator { Coordinator(self) } func makeUIViewController(context: Context) -> PKAddPassesViewController { guard let passVC = PKAddPassesViewController(pass: pass) else { return PKAddPassesViewController() } passVC.delegate = context.coordinator return passVC } func updateUIViewController(_ uiViewController: PKAddPassesViewController, context: Context) {} }
2. 修正调用侧代码
父视图中直接把控制导航显隐的PassKitPresent绑定传入即可,不需要多余的onChange监听:
// 父视图状态变量 @State private var PassKitPresent = false // 你自己生成的PKPass实例 var targetPass: PKPass = ... // 导航跳转代码 NavigationLink( destination: PassKit(isPresented: $PassKitPresent, pass: targetPass) .ignoresSafeArea() .navigationBarHidden(true), isActive: $PassKitPresent, label: {} )
补充说明
如果你不需要push进入添加页,更推荐用sheet弹出的方式实现,代码更简洁,也更符合Wallet添加凭证的系统交互规范:
// 父视图中添加sheet修饰符 .sheet(isPresented: $PassKitPresent) { PassKit(isPresented: $PassKitPresent, pass: targetPass) .ignoresSafeArea() }
内容的提问来源于stack exchange,提问作者Ashley Bailey
相关产品推荐
相关产品推荐

