SwiftUI 中的自定义事件修饰符

Posted

技术标签:

【中文标题】SwiftUI 中的自定义事件修饰符【英文标题】:Custom event modifier in SwiftUI 【发布时间】:2020-03-31 13:00:36 【问题描述】:

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

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)
            
        
    


弹出文本

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】:

我无法为您提供完整的解决方案,因为我没有您的所有代码以及您获取所选项目的方法,但是我知道从哪里开始。

事实证明,使用以下语法声明一个函数:

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)
        
        
    

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

希望这可以让您对它的工作原理有所了解,如果我不能提供完整的解决方案,请见谅

【讨论】:

我在自己的应用程序中试了一下。非常感谢@Chiel 的这种洞察力

以上是关于SwiftUI 中的自定义事件修饰符的主要内容,如果未能解决你的问题,请参考以下文章

表单修饰符自定义指令计算属性侦听器过滤器生命周期

表单修饰符自定义指令计算属性侦听器过滤器生命周期

将自定义 UIKit 事件从自定义 UIKit 控件公开到 SwiftUI

在 SwiftUI 的自定义视图中访问图像的修饰符

SwiftUI-自定义修饰符

DOM3中的自定义事件