Как можно работать со структурой внутри структуры в SwiftUI в разных представлениях? - PullRequest
2 голосов
/ 21 января 2020

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

import SwiftUI

struct User: Identifiable, Hashable {
    var id = UUID()
    var firstName = ""
    var lastName = ""
    var hobbiesOfUser = [Hobbies]()
}

struct Hobbies: Identifiable, Hashable {
    var id = UUID()
    var nameOfHobby = ""
    var nameClub = ""
}

class UsersStorage: ObservableObject {
   @Published var users = [User]()
}

struct ContentView: View {

    @EnvironmentObject var userStorage: UsersStorage
    @State private var isPresented = false

    var body: some View {
        NavigationView {
            List(userStorage.users) { singleUser in
                VStack {
                    HStack {
                        Text(singleUser.firstName)
                         Text(singleUser.lastName)
                    }
                }
                }
            .navigationBarItems(trailing:
                    Button(action: {
                        self.isPresented = true
                    }) {
                        Text("New User")
                    }.sheet(isPresented: $isPresented, onDismiss: {
                        self.isPresented = false
                    }) {
                        AddUserView(isPresented: self.$isPresented, user: User()).environmentObject(self.userStorage)
                    }

                )
        }
    }
}

struct AddUserView: View {

@EnvironmentObject var userStorage: UsersStorage
@Binding var isPresented: Bool
@State var user: User
@State var hobbiesOfUser = [Hobbies]()



    var body: some View {
        NavigationView {
            VStack {
                Text("First Name")
                TextField("First Name", text: $user.firstName)
                Text("Last Name")
                TextField("Last Name", text: $user.lastName)
                NavigationLink(destination: AddHobbieView(hobbie: Hobbies())) {
                    Text("Add New Hobbie")
                }
                List(user.hobbiesOfUser) { singleHobbie in
                    VStack {
                        HStack {
                            Text(singleHobbie.nameOfHobby)
                             Text(singleHobbie.nameClub)
                        }
                    }
                }
                HStack {
                    Button(action: {
                        self.isPresented = false
                    }){
                        Text("Cancel")
                    }
                    Button(action: {
                        self.userStorage.users.append(self.user)
                        self.isPresented = false
                    }){
                        Text("Save")
                    }
                }

            }
        }
    }

}

struct AddHobbieView: View {

@EnvironmentObject var userStorage: UsersStorage
    @State var hobbie: Hobbies


    var body: some View {
        VStack {
            Text("Hobby")
            TextField("First Name", text: $hobbie.nameOfHobby)
            Text("Club")
            TextField("Last Name", text: $hobbie.nameClub)
            HStack {
                Button(action: {
//                    self.userStorage.users.append(self.hobbie)
                }){
                    Text("Cancel")
                }
                Button(action: {
                }){
                    Text("Save")
                }
            }

        }
    }

}

Мой вопрос: как я могу добавить хобби в список в AddUserView и получить кнопки в AddHobbieView, позволяющие мне go вернуться в AddUserView.

1 Ответ

0 голосов
/ 22 января 2020

Вы добавляете @Environment(\.presentationMode) var presentationMode к AddHobbieView и звоните self.presentationMode.wrappedValue.dismiss(), когда хотите отклонить view

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...