Как обновить SwiftUIView с помощью переменной @StateOut? и проблема ошибки сегментации - PullRequest
1 голос
/ 20 марта 2020

Я хочу увеличить переменную при действии кнопки и показать значение в тексте. Я могу сделать это с переменной @State var i: Int = 0. Но я хочу обновить значение из другого файла класса или swift. Таким образом, этот файл не может получить доступ к этой переменной, если он не является stati c. Но State не может быть stati c, так как он не может скомпилироваться с ошибкой segmentation fault при сборке.

Поэтому я подумал о том, чтобы сделать его простой переменной. Затем обновление из этого класса, а затем присвоение его переменной @State. Но этого не происходит, потому что для обновления переменной я использую другую функцию stati c в структуре SwiftUIView. Я могу обновить переменную stati c, но не могу обновить представление.

Вот код для UIVIew:

struct ContentView: View {

//private var Arr = [String]()
@State static var x: Int = 0 //Causes segmentation fault, Removing static runs but can't access var x

static var testVar: Int = 0

var body: some View {
    VStack{

        Text("Hello, Time: \(ContentView.testVar)")

        Button(action: {
            _ = timer().testMe() // calling other class method, is this Okay?


        }) {

        Text("Button")

            }
    }
}

static func bigGuy(){

    testVar += 1
    print("Hello You clicked this time: \(testVar)") // Without next line it can run and print with no issue.
    self.x = testVar // Don't want to use this, But how do I update View ?

}

Так как мне обновить это простое представление?

1 Ответ

1 голос
/ 20 марта 2020

Не используйте stati c, вместо этого поместите эту переменную в модель представления и используйте экземпляр модели представления в обоих представлениях, поэтому один изменяет его, другой представляет его, как в примере ниже

class ViewModel: ObservableObject {
   @Published var x: Int = 0
}

struct View1: View {
   @ObservedObject var vm: ViewModel
   var body: some View {
      Text("\(mv.x)")
   }
}

struct View2: View {
   @ObservedObject var vm: ViewModel
   var body: some View {
      Button("Modify") { self.mv.x += 1 }
   }
}

struct ContentView: View {
   let vm = ViewModel()
   var body: some View {
      VStack {
          View1(vm: self.vm)
          View2(vm: self.vm)
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...