Как передать переменную из одного представления в другое в SwiftUI - PullRequest
0 голосов
/ 18 октября 2019

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

Я попытался создать новую структуру в представлении один и получить доступ к этой переменной в представлении 2.

// View 1

@State var count = MyNumber.number

// Body of app

Button(action: {self.count = self.count-10}) {
                    Text("-")   
                }
Text("\(count)")

struct MyNumber {
    static var number = 0
}

// View 2

 @State var countit = MyNumber.number

// Body

Button(action: {self.countit = 0}) {
            Text("Reset")
            }

Текст в представлении один все еще показывает число, которое было вычислено в представлении 1

1 Ответ

1 голос
/ 18 октября 2019

Если View2 используется в View1, вы можете сделать что-то вроде этого:

View1:

struct FirstView: View {
    @State var count = 0
    var body: some View {
        VStack{
            Text("\(self.count)")
            Button(action:
                {self.count = self.count-10})
            {
                Text("-")
            }
            SecondView(count: self.$count)
        }
    }
}

И View2:

struct SecondView: View {
    @Binding var count: Int
    var body: some View {
        Button(action: {self.count = 0}) {
            Text("Reset")
        }
    }
}

Редактировать

Если они представляют собой совершенно разные представления и нуждаются в едином источнике правды, вы можете использовать observableObject / EnvironmentVariables. Лучше всего было бы добавить переменную окружения в ContentView, где она впервые определена в SceneDelegate

ContentView().environmentObject(SourceOfTruth())

Вот SourceOfTruth:

class SourceOfTruth: ObservableObject{
    @Published var count = 0
}

Тогда вы можете использовать EnvironmentObjects для других видов: Вот ContentView:

struct ContentView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        VStack {
            FirstView()
            SecondView()
        }
    }
}

Вот FirstView:

struct FirstView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
       VStack{
        Text("\(self.truth.count)")
           Button(action:
            {self.truth.count = self.truth.count-10})
           {
               Text("-")
           }
       }
    }
}

Вот SecondView:

struct SecondView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        Button(action: {self.truth.count = 0}) {
            Text("Reset")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...