我创建了一个自定义按钮,其中显示了一个弹出框。这是我的代码:
PopupPicker
struct PopupPicker: View {
@State var selectedRow: UUID?
@State private var showPopover = false
let elements: [PopupElement]
var body: some View {
Button((selectedRow != nil) ? (elements.first { $0.id == selectedRow! }!.text) : elements[0].text) {
self.showPopover = true
}
.popover(isPresented: self.$showPopover) {
PopupSelectionView(elements: self.elements, selectedRow: self.$selectedRow)
}
}
}
PopupSelectionView
struct PopupSelectionView: View {
var elements: [PopupElement]
@Binding var selectedRow: UUID?
var body: some View {
List {
ForEach(self.elements) { element in
PopupText(element: element, selectedRow: self.$selectedRow)
}
}
}
}
PopupText
struct PopupText: View {
var element: PopupElement
@Binding var selectedRow: UUID?
var body: some View {
Button(element.text) {
self.presentation.wrappedValue.dismiss()
self.selectedRow = self.element.id
}
}
}
那很好,但是我可以创建一个自定义事件修饰符,以便编写:
PopupPicker(...)
.onSelection { popupElement in
...
}
答案 0 :(得分:0)
我无法为您提供完整的解决方案,因为我没有您的所有代码,因此您无法以任何方式获得所选项目,但是我不知道从哪里开始。
事实证明,使用以下语法声明函数:
func `onSelection`'(arg:type) {
...
}
创建.onSelection
的功能,如下所示:
struct PopupPicker: View {
@Binding var selectedRow: PopupElement?
var body: some View {
...
}
func `onSelection`(task: (_ selectedRow: PopupElement) -> Void) -> some View {
print("on")
if self.selectedRow != nil {
task(selectedRow.self as! PopupElement)
return AnyView(self)
}
return AnyView(self)
}
}
理论上,您可以在如下视图中使用它:
struct ContentView: View {
@State var popupEl:PopupElement?
var body: some View {
PopupPicker(selectedRow: $popupEl)
.onSelection { element in
print(element.name)
}
}
}
但是我无法正确测试,请评论您的发现
希望这可以为您提供一些工作上的见识,如果无法提供完整的解决方案,请对不起