Hello guys,
I can't figure it out how to pass data between content view and the detail view.
I tried several times but it won't work.
Here is my code:
struct ContentView: View {
@StateObject var activities = Activities()
@State private var showingAddView = false
var body: some View {
NavigationView {
List {
ForEach(activities.activities) { activity in
NavigationLink {
DetailView()
} label: {
HStack {
Text(activity.name)
.font(.headline)
}
}
}
.onDelete(perform: deleteRows)
}
.navigationTitle("Activity Tracker")
.toolbar {
Button {
showingAddView = true
} label: {
Image(systemName: "plus")
}
}
.sheet(isPresented: $showingAddView) {
// more code to come
AddActivityView()
}
}
}
func deleteRows(at offsets: IndexSet) {
activities.activities.remove(atOffsets: offsets)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI
struct AddActivityView: View {
@ObservedObject var activities = Activities()
@Environment(\.dismiss) var dismiss
@State private var name = ""
var body: some View {
NavigationView {
Form {
TextField("Add the activity name", text: $name)
}
.navigationTitle("New activity")
.toolbar {
Button {
let activity = Activity(name: name, counter: 0)
activities.activities.append(activity)
dismiss()
} label: {
Text("Save")
}
.disabled(name.isEmpty ? true : false)
}
}
}
}
struct AddActivityView_Previews: PreviewProvider {
static var previews: some View {
AddActivityView()
}
}
import SwiftUI
struct DetailView: View {
var body: some View {
NavigationView {
Text("Hello")
}
}
}
struct DetailView_Previews: PreviewProvider {
static var previews: some View {
DetailView()
}
}
import Foundation
struct Activity: Codable, Identifiable, Equatable {
var id = UUID()
var name: String
var counter: Int
}
import Foundation
class Activities: ObservableObject {
@Published var activities = [Activity]() {
didSet {
if let encoded = try? JSONEncoder().encode(activities) {
UserDefaults.standard.set(encoded, forKey: "Activities")
}
}
}
init() {
if let savedActivities = UserDefaults.standard.data(forKey: "Activities") {
if let decodedActivities = try? JSONDecoder().decode([Activity].self, from: savedActivities) {
activities = decodedActivities
return
}
}
activities = []
}
}
Thank you all