swiftui 中的 UIButton(Sender: UIButton) 是什么?

What do we have as UIButton(Sender: UIButton) in swiftui?

在 UIKit 中,我通过代码捕获了按钮发送器(点击了哪个按钮)

       let colorVC = UIColorPickerViewController()
       colorVC.delegate = self
       clickedButton = sender
       present(colorVC, animated: true)
   }

我想在 SwiftUI 中完成同样的事情。

其中 flagList.name 来自 struct,我想知道点击了哪个按钮,以便相应地调整标志名称。

``` Button(action: {
            
            print("tapped")
        }, label: {
            List(flagList) { flagList in
             
                
                
                HStack(spacing: 15){
                Image(flagList.flagName)
                    .resizable()
                    .scaledToFit()
                    .clipShape(Circle())
                    .frame(width: 30, height: 30, alignment: .trailing)
                    
               
                    
                Text(flagList.name)
                    
                    .font(.system(size: 25, weight: .light, design: .default))

                }
            }


首先,我认为你的按钮位置不对。您可能需要一个按钮列表,而不是一个包含列表的按钮。

然后,您可以存储代表当前选定按钮的 属性:

@State var currentSelectedFlagName: String

请注意,我说的是代表,而不是商店。在 SwiftUI 中,您不应存储对单个视图(包括按钮)的引用。

然后您可以在点击时将 currentSelectedFlagName 设置为当前选择的旗帜名称。

struct ContentView: View {
    
    ...
    
    /// represents current selected button
    @State var currentSelectedFlagName: String
    
    var body: some View {
        List(flagList) { flagList in
            Button(action: {

                /// set the property
                currentSelectedFlagName = flagList.flagName
                print("tapped")
            }) {
                HStack(spacing: 15){
                    Image(flagList.flagName)
                        .resizable()
                        .scaledToFit()
                        .clipShape(Circle())
                        .frame(width: 30, height: 30, alignment: .trailing)
                    
                    Text(flagList.name)
                        .font(.system(size: 25, weight: .light, design: .default))
                    
                }
            }
        }
    }
}