如何检测PhotosPicker被唤起?解决唤起时代码无法触发的问题
解决PhotosPicker唤起时无法触发代码的问题
直接给PhotosPicker添加.onTapGesture或.onAppear不会在唤起选择器时触发,因为PhotosPicker内部的按钮已经处理了点击事件,外部手势会被拦截。
你可以改用绑定显示状态的PhotosPicker构造器,配合自定义按钮来实现需求,这样能在唤起选择器前执行你需要的代码:
@State private var isPickerPresented = false @State private var selectedItem: PhotosPickerItem? @State private var selectedPhotoData: Data? var body: some View { Button(action: { // 这里写唤起PhotosPicker时要运行的代码 print("--- PhotosPicker 即将打开 ---") isPickerPresented = true }) { Image(systemName: "photo") .controlSize(.large) .foregroundColor(.white) } .PhotosPicker(isPresented: $isPickerPresented, selection: $selectedItem, matching: .any(of: [.images, .not(.livePhotos)])) .onChange(of: selectedItem) { newItem in Task { if let data = try? await newItem?.loadTransferable(type: Data.self) { selectedPhotoData = data } } } }
原理说明
原来的PhotosPicker(content:)构造器封装了内部的按钮组件,点击事件被内部处理,导致外部的.onTapGesture无法响应。换成isPresented绑定的形式后,你可以通过自定义按钮完全控制唤起时机,同时在按钮的action闭包中执行需要的前置代码。
内容的提问来源于stack exchange,提问作者irrbloss
相关产品推荐
相关产品推荐

