Как инициализировать производные переменные в методах тела в SwiftUI (или альтернативный подход) - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь найти правильный путь к инициализированным производным переменным в методе body для представления SwiftUI. Примером может быть строковое значение для редактируемого целого числа, которое затем будет отредактировано в TextField. Целое число, например, может быть частью @ObservedObject. Я не могу найти какой-либо удаленно чистый способ сделать это.

Я изучал использование пользовательских инициализаторов, но это не похоже на правильную вещь. Я даже не уверен, что этот код будет запущен в нужное время.

Я также пытался использовать метод .onAppear для TextField, но этот метод не выполняется повторно, когда представлениеперестроен.

упрощенный пример:

final class Values : ObservableObject {
  @Published var count: Int = 0;
}

var sharedValues = Values()

struct ContentView : View {
  @ObservedObject var values = sharedValues
  var body: some View {
    VStack {
      Button(
        action: { self.add() },
        label: { Text("Plus")}
      )
      InnerView()
    }
  }
  func add() { values.count += 1 }
}

struct InnerView : View {
  @ObservedObject var values = sharedValues
  @State private var text = ""
  var body: some View {
    // text = String(value.count) - what I want to do
    TextField("", text: $text, onEditingChanged: updateCount)
      .textFieldStyle(RoundedBorderTextFieldStyle())
  }
  func updateCount(updated: Bool) {  /* this isn't important in this context */}
}

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

Я пробовал несколько подходов для достижения такого типа результата, ноподойди.

1 Ответ

0 голосов
/ 23 октября 2019

Я не уверен, правильно ли я понимаю ваш вопрос, но если вы просто пытаетесь изменить число с помощью кнопки, отобразите число в текстовом поле, а затем сможете редактироватьэто там, вам не нужно ObserverableObject или несколько просмотров. Вот пример того, как вы можете это сделать:

struct ContentView: View {
    @State var count = 0
    @State var countStr = ""
    var body: some View {
        VStack {
            Button(action: {
                self.count += 1
                self.countStr = "\(self.count)"
            }) {
                Text("Plus")
            }
            TextField("", text: $countStr, onEditingChanged: updateCount)
        }
    }
    func updateCount(updated: Bool) { /* this isn't important in this context */ }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...