Действие SwiftUI при отмене выбора строки Lists - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть список SwiftUI, который изменяет атрибут в строке, например цвет на кране.
Теперь я хочу запустить действие, например сбросить цвет, если коснулся другой строки.

Я ищу событие, которое получает строка, если она отменена.

Вот мой пример кода:

struct ContentView: View {
  @State var data : [String] = ["first","second","third","4th","5th"]
  var body: some View {
    List {
      ForEach (data, id: \.self) {
        item in
        ColoredRow(text: item)
      }
    }
  }
}

struct ColoredRow: View {
  var text: String = ""
  @State var col : Color = Color.white

  var body: some View{
    Text("\(text)")
    .background(col)
    .onTapGesture {
      self.col = Color.red
    }
//  .onDeselect {
//    print("disappeare \(self.text)")
//    self.col = Color.white
//  }
  }
}

1 Ответ

1 голос
/ 28 февраля 2020

Давайте вспомним, что SwiftUI является реактивным (ie. Управляемым состоянием, а не управляемым событиями), поэтому, если мы не хотим что-то менять в пользовательском интерфейсе, нам нужно найти способ изменить это через состояние (пользовательский интерфейс или модель, но состояние).

Итак, ниже немного изменен ваш код, чтобы показать возможный подход. Протестировано с Xcode 11.2 / iOS 13.2.

demo

struct ContentView: View {
    @State var data : [String] = ["first","second","third","4th","5th"]
    @State private var selectedItem: String? = nil
    var body: some View {
        List {
            ForEach (data, id: \.self) {
                item in
                ColoredRow(text: item, selection: self.$selectedItem)
            }
        }
    }
}

struct ColoredRow: View {
    var text: String = ""
    @Binding var selection: String?

    @State var col : Color = Color.white

    var body: some View{
        Text("\(text)")
            .background(selection == text ? Color.red : Color.white)
            .onTapGesture {
                self.selection = (self.selection == self.text ? nil : self.text)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...