ForEach (0 ... 5, id: \ .self) {n в - какова область действия "n"? - PullRequest
0 голосов
/ 04 ноября 2019

См. Следующий TestView. Когда я нажимаю «Кнопка 5», появляется предупреждение « Кнопка 0 нажата ».

struct TestView: View {
   @State var showAlert = false
   var body: some View {
      VStack {
         ForEach(0...5, id: \.self) { n in
            Button(action: {
               self.showAlert.toggle()
            }) {
               Text("Button \(n)")
            }
            .padding(20)
            .border(Color.green, width: 4)
            .padding(8)
            .alert(isPresented: self.$showAlert) {
               Alert(title: Text("Button \(n) clicked"))
            }
         }
      }
   }
}

Независимо от того, какую кнопку я нажимаю, в предупреждении всегда отображается «Кнопка 0 нажата» . Я ожидал, что каждая кнопка должна показать свой собственный индекс кнопки. Хотите знать, почему это так?

1 Ответ

1 голос

Я подозреваю, что это происходит, потому что все в вашем TestView перерисовывается, в то время как переменная state изменяется. Таким образом, ваше предупреждение отображается только для первой итерации цикла. Решение состоит в том, чтобы изменить другую переменную, которая должна содержать индекс нажатой кнопки:

struct TextView: View {
    @State var showAlert = false
    @State var clickedButtonIndex = 0
    var body: some View {
       VStack {
          ForEach(0...5, id: \.self) { n in
             Button(action: {
                self.showAlert.toggle()
                self.clickedButtonIndex = n
             }) {
                Text("Button \(n)")
             }
             .padding(20)
             .border(Color.green, width: 4)
             .padding(8)
             .alert(isPresented: self.$showAlert) {
                Alert(title: Text("Button \(self.clickedButtonIndex) clicked"))
             }
          }
       }
    }
}

И вы получите такой результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...