Подтвердите от модели в SwiftUI - PullRequest
0 голосов
/ 17 апреля 2020

давайте представим, что у меня есть что-то вроде следующего ядра / модели:

class Core: ObservableObject {
  ...
  func action(confirm: () -> Bool) {
    if state == .needsConfirmation, !confirm() {
      return
    }
    changeState()
  }
  ...
}

, а затем я использую этот базовый объект в представлении SwiftUI.

struct ListView: View {
  ...
  var body: some View {
    List(objects) {
      Text($0)
      .onTapGesture {
        core.action {
          // present an alert to the user and return if the user confirms or not
        }
      }
    }
  }
}

Так что кипятим его вниз, мне интересно, как работать с обработчиками, там нужен ввод от пользователя, и я не могу обернуть его вокруг.

1 Ответ

0 голосов
/ 17 апреля 2020

Похоже, вы изменили концепцию обратной интерактивности, вместо этого вам нужно что-то вроде ниже (поцарапанное)

struct ListView: View {
  @State private var confirmAlert = false
  ...
  var body: some View {
    List(objects) {
      Text($0)
      .onTapGesture {
        if core.needsConfirmation {
          self.confirmAlert = true
        } else {
          self.core.action()   // << direct action
        }
      }
    }
    .alert(isPresented: $confirmAlert) {
         Alert(title: Text("Title"), message: Text("Message"), 
             primaryButton: .default(Text("Confirm")) {
                 self.core.needsConfirmation = false
                 self.core.action() // <<< confirmed action
             }, 
             secondaryButton: .cancel())
     }
  }
}

class Core: ObservableObject {
  var needsConfirmation = true
  ...
  func action() {
     // just act
  }
  ...
}

Альтернатива: со скрытой проверкой состояния в Core

struct ListView: View {
  @ObservedObject core: Core

  ...
  var body: some View {
    List(objects) {
      Text($0)
      .onTapGesture {
          self.core.action()   // << direct action
      }
    }
    .alert(isPresented: $core.needsConfirmation) {
         Alert(title: Text("Title"), message: Text("Message"), 
             primaryButton: .default(Text("Confirm")) {
                 self.core.action(state: .confirmed) // <<< confirmed action
             }, 
             secondaryButton: .cancel())
     }
  }
}

class Core: ObservableObject {
  @Published var needsConfirmation = false

  ...
  func action(state: State = .check) {
     if state == .check && self.state != .confirmed {
         self.needsConfirmation = true
         return;
     }
     self.state = state
     // just act
  }
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...