Как заставить просмотр обновления на Appar в быстром пользовательском интерфейсе - PullRequest
0 голосов
/ 19 октября 2019

Есть ли возможность просмотра содержимого просмотра на AppEar? Метод вызывается, но список не обновляется. Кажется, это должен быть какой-то способ

import SwiftUI

var texts = ["0", "0", "0"]

struct ContentView: View {


  var body: some View {
      List {
        Text(texts[0])
        Text(texts[1])
        Text(texts[2])

      }
      .onAppear(){
        texts[0] = "1"
        print(texts)
    }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

.

Ответы [ 2 ]

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

Если вы хотите вызвать повторный рендеринг, вам нужно использовать состояние.

Если вы поместите переменную texts в структуру ContentView и объявите ее как @State, то это вызоветContentView для повторного рендеринга.

Обратите внимание, что вам нужно будет использовать self в onAppear, так как вы ссылаетесь на texts в закрытии.

struct ContentView: View {

  @State private var texts = ["0", "0", "0"] . // Apple suggests that these should be private

  var body: some View {
      List {
        Text(texts[0])
        Text(texts[1])
        Text(texts[2])

      }
      .onAppear(){
        self.texts[0] = "1"
        print(self.texts)
      }
    }
}

Однако, если вы хотите использовать texts для нескольких представлений, вам потребуется создать объект среды. Вы можете сделать это следующим образом:

Создать ObservableObject.

class Texts: ObservableObject {
    @Published var texts = ["0", "0", "0"] // You can obviously choose whichever name you want for this variable.
}

Затем в вашем SceneDelegate создайте экземпляр этого объекта и присоедините его к вашему ContentView.

let texts = Texts()
let contentView = ContentView().environmentObject(texts)

Тогда в ContentView.swift вы можете использовать его так:

struct ContentView: View {

  @EnvironmentObject var texts: Texts

  var body: some View {
      List {
        // notice that you have to access the texts array that is stored in texts object
        Text(texts.texts[0])
        Text(texts.texts[1])
        Text(texts.texts[2])

      }
      .onAppear(){
        self.texts.texts[0] = "1"
        print(self.texts.texts)
       }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(Texts())
    }
}
0 голосов
/ 19 октября 2019

«тексты» должны быть @State, если вы хотите, чтобы представление обновлялось при изменении переменной и помещало его в представление

  @State var texts = ["0", "0", "0"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...