SwiftUI dropDestination 在 macOS 上工作,但不适用于 iOS

问题描述 投票:0回答:1

我的以下视图在 macOS 上运行得非常好:

public struct DropView: View {
    
    @Bindable var store: StoreOf<Feature>
    @State var isDropTargeted = false
    
    public init(
        store: StoreOf<Feature>
    ) {
        self.store = store
    }
    
    public var body: some View {
        Group {
            if isDropTargeted && store.dropsAccepted {
                ZStack {
                    Color.accentColor.opacity(0.2)
                    VStack {
                        Image(systemName: "arrow.up.document")
                            .symbolRenderingMode(.hierarchical)
                            .resizable()
                            .scaledToFit()
                            .frame(width: 64, height: 64)
                        Text("Add file")
                            .foregroundStyle(.secondary)
                    }
                }
            } else {
                Color.clear
            }
        }
        .dropDestination(for: URL.self) { urls, _ in
            store.send(.filesDropped(urls))
            return store.dropsAccepted
        } isTargeted: { targeted in
            isDropTargeted = targeted
        }
    }
}

它不适用于 iOS 或 iPadOS,无论是在模拟器中还是在真实设备上。 (我确定

dropsAccepted
是真的。)

我尝试了不同的方法,但都没有成功:

  • 用蓝色替换透明颜色没有什么区别。
  • 也不能使用
    onDrop
    来代替。
  • A
    contentShape(Rectangle())
    阻止我与底层视图交互,但不会改变任何有关放置的内容。
  • .dropDestination
    添加到颜色(蓝色或透明,带或不带
    contentShape
    )也没有帮助。

当颜色为蓝色而不是透明时,拖动文件表示形式在视图上拖动时会出现“禁止”图标。其他什么都没有改变。无法丢弃,并且

isDropTargeted
也未设置为
true

有人知道这里会发生什么吗?


编辑:不确定这是否相关,但我刚刚将

.draggable(url)
添加到同一应用程序中的另一个视图。在 Mac 上,我可以将图像拖出。在 iOS 上没有任何反应。

ios swiftui drag-and-drop transferable
1个回答
0
投票

看起来Sweeper走在正确的轨道上。

iOS 上的文件应用程序似乎不提供

URL
s。

为了获得它们,我需要创建一个带有

Transferable
FileRepresentation
项目:

struct TransferItem: Transferable, Equatable, Sendable {
    
    public var url: URL
    
    static var transferRepresentation: some TransferRepresentation {
        FileRepresentation(contentType: .item) { item in
            SentTransferredFile(item.url)
        } importing: { received in
            @Dependency(\.fileClient) var fileClient
            let temporaryFolder = fileClient.temporaryReplacementDirectory(received.file)
            let temporaryURL = temporaryFolder.appendingPathComponent(received.file.lastPathComponent)
            let url = try fileClient.copyItemToUniqueURL(at: received.file, to: temporaryURL)
            return Self(url)
        }
    }
}

然后像这样使用它:

.dropDestination(for: TransferItem.self) { items, _ in
    let urls = items.map(\.url)
        store.send(.filesDropped(urls))
        return store.dropsAccepted
    } isTargeted: { targeted in
        isDropTargeted = targeted
    }
© www.soinside.com 2019 - 2024. All rights reserved.