我想做这样的事情:
struct HandleUrlDropModifier<Content>: ViewModifier where Content: DynamicViewContent {
@Environment(\.modelContext) var modelContext
var content: Content
func body(content: Content) -> some View {
content
.dropDestination(for: URL.self) { items, index in
// index is Int
handleUrlDrop(items, at: index)
}
}
func handleUrlDrop(_ items: [URL], at index: Int) {
modelContext.insert(...)
}
}
这有可能吗?
我尝试过的
将其编写为直接扩展是行不通的,因为我想使用变量@Environtment
:
extension DynamicViewContent {
@Environment(\.modelContext) var modelContext // <- not possible
func handleUrlDrop() -> some View {
self
.dropDestination(for: URL.self) { items, index in
modelContext.insert(...)
}
}
}
这适用于常规视图,但.dropDestination
action
对于以下视图有所不同DynamicViewContent
:
struct HandleUrlDropModifier: ViewModifier {
@Environment(\.modelContext) var modelContext
func body(content: Content) -> some View {
content
.dropDestination(for: URL.self) { items, location in
// location is CGPoint
handleUrlDrop(items)
return true
}
}
func handleUrlDrop(_ items: [URL]) {
modelContext.insert(...)
}
}
View
编写一个包装 aDynamicViewContent
并添加修饰符的a 来代替视图修饰符dropDestination
。然后你可以用扩展来包装这个视图DynamicViewContent
,这样它看起来就像一个视图修饰符。