I have “Widget” in my app that im using as a button for a Featured scrollView. The problem im having is that when I call the images from the api it displays them how I want but it repeats the same image several time before showing a new image. Im wanting a different image for each widget.
import SwiftUI
import SDWebImageSwiftUI
struct HomeViewWidget: View {
var event: Event
var body: some View {
VStack {
if let imageUrl = event.images?.first?.url {
ZStack(alignment: .bottomLeading) {
WebImage(url: URL(string: imageUrl))
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 250, height: 250)
.clipped()
.cornerRadius(10)
That is my Actual widget.
this is my view im calling my widget onto.
import SwiftUI
struct HomePageView: View {
@EnvironmentObject var userSettings: UserSettings
@State private var events: [Event] = []
var body: some View {
NavigationView {
VStack {
SearchBarView().padding()
HStack {
Text("Featured")
.font(.headline)
.fontWeight(.heavy)
.padding()
Spacer()
}
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 20) {
ForEach(events, id: .id) { event in
HomeViewWidget(event: event)
}
}
.padding(.horizontal)
}
Spacer()
}
.navigationBarTitle("Explore Events", displayMode: .inline)
.toolbar {
ToolbarItem(placement: .principal) {
VStack {
HStack {
Text("Welcome (userSettings.profile.name)")
.font(.subheadline)
Spacer()
}
HStack {
Text("Explore events")
.font(.largeTitle)
.fontWeight(.heavy)
Spacer()
}
}
}
}
.navigationBarBackButtonHidden(true)
.onAppear {
loadEvents()
}
}
}
private func loadEvents() {
Task {
do {
let loadedEvents = try await fetchTMEvents() ?? [] // Fetch events
let uniqueEvents = Array(Set(loadedEvents)).sorted { $0.name < $1.name } // Remove duplicates and sort
let limitedEvents = Array(uniqueEvents.prefix(3)) // Limit to 5 events for display
DispatchQueue.main.async {
self.events = limitedEvents // Update UI with limited number of events
limitedEvents.forEach { event in
print("Unique Event Displayed: (event.name), ID: (event.id)")
}
}
} catch {
DispatchQueue.main.async {
print("Failed to load events: (error)")
}
}
}
}
}
struct HomePageView_Previews: PreviewProvider {
static var previews: some View {
HomePageView().environmentObject(UserSettings())
}
}
private func uniqueEvents(from events: [Event]) -> [Event] {
var uniqueIds = Set<String>()
return events.filter { uniqueIds.insert($0.id).inserted }
}
And here is my data that ive been trying to use to filter the images:
struct Event: Codable, Identifiable {
let name, type, id, url, locale: String
let images: [EventImage]?
}
extension Event: Hashable {
static func == (lhs: Event, rhs: Event) -> Bool {
return lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
2