You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:42:54