Запрет тумблера и отображение предупреждения в Swiftui - PullRequest
2 голосов
/ 12 апреля 2020

У меня есть несколько тумблеров подряд, но я хочу запретить переключатели, если уже два из них включены. И показывает предупреждение, что максимум 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

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Вот как это может работать:

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
            })
      )
    }
  }
}
0 голосов
/ 12 апреля 2020

попробуйте это:

... но тогда сообщение никогда не исчезнет, ​​потому что вы никогда не установите значения переключателя обратно на 2 ... так что это то, что вам еще нужно сделать. и, возможно, вам следует выполнить проверку внутри действия переключения, а не при построении представления.

struct ContentView: 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
        OperationQueue.main.addOperation {
            self.showAlert = numberOfTrue > 2
        }

        return VStack {
            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")))
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...