Post

Replies

Boosts

Views

Activity

Reply to ELEMENT_TYPE_OF_SET_VIOLATES_HASHABLE_REQUIREMENTS
Here is the code in question to provide more context class HomeViewModel { var pOffers = [Offer]() var forceFetchOffers: Bool = false @MainActor var offersTable: [String: Offer] = [:] var handledAnnouncementIds: Set<String> = [] func fetchOffersAndUpdateCards() { delegate?.setLoadingState(true) Task { await fetchCachedOffersIfNeeded() await refreshCardsFromCachedOffers() } } func fetchCachedOffersIfNeeded() async { guard shouldFetchOffers() else { return } pOffers = await personalization.getOffers() forceFetchOffers = false } func refreshCardsFromCachedOffers() async { let mappedCardsData = await mappedCardData(from: pOffers) await refreshOfferCards(with: mappedCardsData) } func mapToOffersCardData(offer: Offer) async -> OfferCardData? { switch offer.offerType { case .abc: return await hanldeAnnouncementCard(from: offer) case .xyz: return await addItemCardData(from: offer) default: return nil } } @MainActor func mappedCardData(from offers: [Offer]) async -> [OfferCardData] { offersTable.removeAll() handledAnnouncementIds = [] var index: Int = 0 return await offers .asyncCompactMap { guard var cardData = await self.mapToOffersCardData(offer: $0) else { return nil } cardData.cardIndex = index index += 1 offersTable[cardData.id] = $0 return cardData } } func hanldeAnnouncementCard(from offer: Offer) async -> OfferCardData? { if handledAnnouncementIds.contains(offer.itemID) { return nil } handledAnnouncementIds.insert(offer.itemID) return await announcementCardData(from: offer) } func announcementCardData(from offer: Offer) async -> OfferCardData? { guard let announcement = await fetchAnnouncement(for: offer.itemID) else { return nil } return ACardData( ...... ...... } } func showDefaultOfferCards() { Task { let offers = getDefaultOfferTypes() .map { Offer( offerType: $0, offerName: Constants.defaultCardOfferName ) } let defaultCardsData = await mappedCardData(from: offers) await refreshDefaultOfferCards(with: defaultCardsData) } } } public extension Sequence { func asyncCompactMap<T>(_ transform: (Element) async -> T?) async -> [T] { var values: [T] = [] for element in self { guard let transformedElement = await transform(element) else { continue } values.append(transformedElement) } return values } } struct Offer { let itemID: String let offerType: OfferType let offerName: String init( offerType: OfferType, offerName: String = "", itemID: String = "", ) { self.offerType = offerType self.offerName = offerName self.itemID = itemID } }
Topic: Programming Languages SubTopic: Swift Tags:
1w
Reply to iOS 17.4 SwiftUI .toolbar(.hidden, for: .tabBar) not work
This is what I did for my tabs and no longer have the problem with system tabbar showing up unexpectedly. @State var activeTab: Screen = .home var body: some View { TabView(selection: $activeTab) { switch activeTab { case .home: HomeRoot() .tag(Screen.home) case .menu: MenuRoot() .tag(Screen.menu) case .rewards: RewardsRoot() .tag(Screen.rewards) case .scan: Scan() .tag(Screen.scan) default: EmptyView() } } .safeAreaInset(edge: .bottom) { TabBarView( activeTab: $activeTab ) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
May ’24
Reply to How to remove space before SwiftUI List Sections?
struct ContentView: View { var body: some View { ScrollView { LazyVStack(alignment: .leading, spacing: 0, pinnedViews: [.sectionHeaders], content: { ForEach(0..<10) { section in Section { ForEach(0..<10) { item in VStack(alignment: .leading, spacing: 0) { Text("List Item \(item)") .frame(minHeight: 50) Divider() } .padding(.leading) } } header: { Text("Section \(section)") .bold() .frame(height: 50) .frame(maxWidth: .infinity) .background(Color(.systemGray6)) } } }) } .clipped() } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jun ’23
Reply to SwiftUI Button unintended animation during transition
Try this struct ButtonAnimationTest: View { @State var showButton: Bool = true var body: some View { VStack { if showButton { Button("makeTransition") { withAnimation { showButton.toggle() } } .buttonStyle(MyButtonStyle()) .padding() .background(Color.black) .transition(.slide) } } .animation(.easeIn(duration: 1), value: showButton) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
May ’23