单击时从循环中禁用按钮

Posted

技术标签:

【中文标题】单击时从循环中禁用按钮【英文标题】:Disable button from loop when clicked 【发布时间】:2020-12-25 06:30:08 【问题描述】:

目前我有一个 foreach 循环引入一个项目列表,每个项目都有一个执行功能的按钮。单击时如何禁用单个按钮,仅针对单个用户而不使用用户帐户?提前非常感谢!

额外背景: 每个项目都有一个本质上是“添加”按钮,它将 +1 添加到数据库中的一个字段,每个用户应该只被允许按一次按钮,因此我需要在单击后禁用它。截至目前,他们可以根据需要多次点击它,数据库中的数字会不断增加。

代码

ForEach(items.indices, id: \.self)  i in
HStack 
   Text(items[i].name)
   Spacer()
   Button(action: 
      self.performFunction()
      ) 
          Text("Yes")
             .font(.system(size: 14))
             .foregroundColor(Color.white)
             .padding(.horizontal)
       
   

【问题讨论】:

【参考方案1】:

假设“Item”是一个结构或一个类,您总是可以添加一个布尔标志来指示该项目是否被选中。

所以,例如,这样的事情:

struct Item 
    var name: String
    var selected: Bool = false


struct ContentView: View 
    @State private var items: [Item] = [
        Item(name: "Bob"),
        Item(name: "Joe"),
        Item(name: "John Cena")
    ]
        
    var body: some View 
        ForEach(items.indices, id: \.self)  i in
            HStack 
                Text(items[i].name)
                Spacer()
                Button(action: 
                    items[i].selected.toggle()
                ) 
                    Text(items[i].selected ? "Yes" : "No")
                        .font(.system(size: 14))
                        .foregroundColor(.black)
                        .padding(.horizontal)
                
            
        
    


【讨论】:

这仅适用于代码,但我也在该按钮上调用了一个函数,该按钮似乎将其重置为 false,我不确定为什么 func yesTrigger() let db = Firestore.firestore() db.collection("mainItems").document(itemID).collection("items").document("\(self.selection)").updateData([AnyHashable("yes"): FieldValue.increment(Int64(1))]) 【参考方案2】:

目前尚不清楚上下文...但可能的解决方案是创建与items 相同长度的数组并使用它来存储单击状态,例如

@State private var clicked: [Bool]  // initiate with array of false when `items` ready

...

   Button(action: 
      self.performFunction()
      self.clicked[i] = true      // << here !!
      ) 
          Text("Yes")
             .font(.system(size: 14))
             .foregroundColor(Color.white)
             .padding(.horizontal)
       
       .disabled(self.clicked[I])        // // << here !!

【讨论】:

这是有道理的,但是当我把这段代码放进去时,在预览部分我得到'View' initializer is inaccessible due to 'private' protection levelMissing argument for parameter 'clicked' in callInsert ', clicked:&lt;#[Bool]#&gt;' 还为问题添加了额外的上下文

以上是关于单击时从循环中禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

单击后禁用按钮

在 JQuery 中单击后禁用按钮

在android中禁用按钮单击声音

单击时如何使命令不禁用按钮

在 SwiftUi 中禁用默认按钮单击动画

单击时禁用按钮