ios - 防止切换开关打开并在 Swiftui 中显示警报

标签 ios swift swiftui

我有一些连续的拨动开关,但如果其中两个已经打开,我想防止开关打开。并显示一个警报,允许最多打开其中的 2 个。这是我的代码:

struct PreventToggle: View {

    @State private var isCheckeds = [false, true, true, false, false, false]
    @State var showAlert = false

    var body: some View {

        let numberOfTrue = isCheckeds.filter{$0}.count
        showAlert = numberOfTrue > 2

        return ForEach(0 ..< isCheckeds.count) { id in

                Toggle("Switch \(id)", isOn: self.$isCheckeds[id])
                    .alert(isPresented: self.$showAlert) {
                        Alert(title: Text("Maximum Limit!"), message: Text("Maximum limit is: 3"), dismissButton: .default(Text("Got it")))
                }
        }
    }
}

enter image description here

最佳答案

它是这样工作的:

struct PreventToggle: View {
  @State private var isCheckeds = [false, true, true, false, false, false]
  @State var lastSelected = -1

  func alertBinding() -> Binding<Bool> {
    Binding<Bool>(
      get: {
        let numberOfTrue = self.isCheckeds.filter{$0}.count
        return numberOfTrue > 2 && self.lastSelected != -1
      },
      set: { _ in }
    )
  }

  func toggleBinding(for index: Int) -> Binding<Bool> {
    Binding<Bool>(
      get: {
        return self.isCheckeds[index]
      },
      set: { bool in
        self.isCheckeds[index] = bool
        self.lastSelected = index
      }
    )
  }

  var body: some View {
    VStack {
      ForEach(0 ..< isCheckeds.count) { id in
        Toggle("Switch \(id)", isOn: self.toggleBinding(for: id))
      }
    }
    .alert(isPresented: alertBinding()) {
      Alert(title: Text("Maximum Limit!"),
            message: Text("Maximum limit is: 3"),
            dismissButton: .default(Text("Got it"), action: {
              self.isCheckeds[self.lastSelected] = false
              self.lastSelected = -1
            })
      )
    }
  }
}

关于ios - 防止切换开关打开并在 Swiftui 中显示警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61172203/

相关文章:

swift - 如何在 Swift 4 中设置视频的偏移量?寻找(到:) doesn't seem to work

ios - 由于未捕获的异常而终止应用程序,原因 : 'ERROR: UIScrollView does not support multiple observers implementing

swift - 使用 Swift 重构/组合多个几乎相同的类的推荐方法?

ios - 如何使用 SwiftUI 将应用程序应用到 iOS 13 深色模式?

ios - UIScrollView 子级坐标反转

ios - 我注释掉了一个方法,但 Xcode 仍然记得它并给我一个错误

ios - 加载新数据时使缓存数据显示为响应式

ios - 如何在右侧创建一个带有图标的按钮?

ios - 如何按 id 或月份 : Descending (Latest Post First)? 对数组进行排序

swiftui - 阴影不透明度swiftUI