我的以下视图在 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
来代替。contentShape(Rectangle())
阻止我与底层视图交互,但不会改变任何有关放置的内容。.dropDestination
添加到颜色(蓝色或透明,带或不带 contentShape
)也没有帮助。当颜色为蓝色而不是透明时,拖动文件表示形式在视图上拖动时会出现“禁止”图标。其他什么都没有改变。无法丢弃,并且
isDropTargeted
也未设置为 true
。
有人知道这里会发生什么吗?
编辑:不确定这是否相关,但我刚刚将
.draggable(url)
添加到同一应用程序中的另一个视图。在 Mac 上,我可以将图像拖出。在 iOS 上没有任何反应。
看起来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
}