Skip to main content

Display a List of Habits!

Observing a list of all Habits​

To display the list of habits we'll be creating in ConfigView, we'll start by adding to ConfigView all the Habits from the local DB

UI/ConfigView.swift
@ObservedRealmObject var habits: Habits

This works as a query, reading all objects of type Habit from our local DB. As this is Observed, any changes will be reflected automatically in the View.

Update Preview code​

We need to add the parameter habits when we instantiate a new ConfigView in the Preview.

UI/ConfigView.swift
struct ConfigView_Previews: PreviewProvider {
static var previews: some View {
ConfigView(habits: Habits())
}
}

Update MainView​

As we also use ConfigView in MainView we need to update the code

UI/MainView.swift
            ConfigView(habits: Habits())
.tabItem {
Image(systemName: "wrench.and.screwdriver")
Text("Config")
}

Add a SwiftUI List to ConfigView​

We'll replace the contents of ConfigView and add a list that show's each Habit's name.

UI/ConfigView.swift
struct ConfigView: View {    
var body: some View {
List {
ForEach(habits.habits) { habit in
Text("\(habit.name)")
}
}
}
}

Identifiable​

If we compile, we'll get this error:

Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Habit' conform to 'Identifiable'

We need that Habits, Habit conform to RealmSwift.ObjectKeyIdentifiable, so we can use them easily with ForEach

/Model/Habit.swift
class Habit: Object, ObjectKeyIdentifiable {
/Model/Habits.swift
class Habits: Object, ObjectKeyIdentifiable {

The Preview​

Is empty! That's because we're passing an empty Habits() object that has no Habit inside. Let's fix this adding some data to our Realm.