SwiftUI中的自定义事件修饰符

时间:2020-03-31 13:00:36

标签: swiftui

我创建了一个自定义按钮,其中显示了一个弹出框。这是我的代码:

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
        ...
    }

1 个答案:

答案 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)
        }
        
    }
}

但是我无法正确测试,请评论您的发现

希望这可以为您提供一些工作上的见识,如果无法提供完整的解决方案,请对不起