import SwiftUI
struct RefreshableListView: View {
@State private var items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) { item in
Text(item)
}
}
.navigationTitle("Refreshable List")
.refreshable {
try? await Task.sleep(nanoseconds: 2_000_000_000) // 2 seconds delay
let newItemNumber = items.count + 1
items.append("New Item \(newItemNumber)")
}
}
}
}
struct RefreshableListView_Previews: PreviewProvider {
static var previews: some View {
RefreshableListView()
}
}This solution uses SwiftUI's .refreshable modifier to add pull-to-refresh functionality to the List. When the user pulls down, the refresh closure runs asynchronously.
Inside the closure, Task.sleep pauses for 2 seconds to simulate loading. Then, a new item labeled "New Item X" is appended to the items array, where X is the next number after the current count.
The list automatically updates because items is a @State variable. The loading spinner is shown automatically by SwiftUI during the refresh.