Skip to content

Latest commit

 

History

History
213 lines (172 loc) · 4.46 KB

README.md

File metadata and controls

213 lines (172 loc) · 4.46 KB

Company / Employee

Basic Setup

Companies

import Foundation

struct Employee: Hashable, Identifiable {
    let id = UUID()
    let name: String
}

struct Company: Hashable, Identifiable {
    let id = UUID()
    let name: String
    let employees: [Employee]
}

let employee1 = Employee(name: "Peter")
let employee2 = Employee(name: "Paul")
let employee3 = Employee(name: "Mary")
let employees = [employee1, employee2, employee3]

let company1 = Company(name: "Apple", employees: employees)
let company2 = Company(name: "IBM", employees: employees)
let company3 = Company(name: "Microsoft", employees: employees)

class Companies: ObservableObject {
    @Published var items = [company1, company2, company3]
}

MainApp

import SwiftUI

@main
struct MainApp: App {
    @StateObject private var companies = Companies()

    var body: some Scene {
        WindowGroup {
            ContentView(companies: companies)
        }
    }
}

ContentView

import SwiftUI

struct ContentView: View {
    @StateObject var companies: Companies
    @State var showingAddCompany = false

    var body: some View {
        NavigationStack {
            List(companies.items) { company in
                NavigationLink(value: company) {
                    Text(company.name)
                }
            }
            .navigationTitle("Companies")
            .navigationDestination(for: Company.self) { company in
                CompanyView(company: company)
            }
            .toolbar {
                Button(action: {
                    self.showingAddCompany.toggle()
                }) {
                    Image(systemName: "plus")
                }
            }
            .sheet(isPresented: $showingAddCompany) {
                Text("Add Company")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(companies: Companies())
            .preferredColorScheme(.dark)
    }
}

CompanyView

import SwiftUI

struct CompanyView: View {
    let company: Company

    var body: some View {
        List(company.employees) { employee in
            NavigationLink(value: employee) {
                Text(employee.name)
            }
        }
        .navigationDestination(for: Employee.self) { employee in
            EmployeeView(employee: employee)
        }
        .navigationTitle("Employees")
    }
}

struct CompanyView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationStack {
            CompanyView(company: company1)
                .preferredColorScheme(.dark)
        }
    }
}

EmployeeView

import SwiftUI

struct EmployeeView: View {
    let employee: Employee

    var body: some View {
        Text("Hello \(employee.name)")
    }
}

struct EmployeeView_Previews: PreviewProvider {
    static var previews: some View {
        EmployeeView(employee: employee1)
            .preferredColorScheme(.dark)
    }
}

Add Company as Modal

Add a Toolbar with @State variable to toggle .sheet display:

ContentView

struct ContentView: View {
    @State var showingAddCompany = false

    var body: some View {
        NavigationStack {
            .navigationTitle("Companies")
            .toolbar {
                Button(action: {
                    self.showingAddCompany.toggle()
                }) {
                    Image(systemName: "plus")
                }
            }
            .sheet(isPresented: $showingAddCompany) {
                Text("Add Company")
            }
        }
    }
}

Save Company

AddCompany

import SwiftUI

struct AddCompany: View {
    @StateObject var companies: Companies
    @State var name = ""
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        NavigationStack {
            TextField("New company name", text: $name)
                .toolbar {
                    Button(action: {
                        let company = Company(name: name, employees: [])
                        self.companies.items.append(company)
                        self.presentationMode.wrappedValue.dismiss()
                    }) {
                        Text("Save")
                    }
                }
        }
    }
}

struct AddCompany_Previews: PreviewProvider {
    static var previews: some View {
        AddCompany(companies: Companies())
    }
}