Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save karigrooms/b16d073fa4d607da1c3138e90d871126 to your computer and use it in GitHub Desktop.
Save karigrooms/b16d073fa4d607da1c3138e90d871126 to your computer and use it in GitHub Desktop.
Blog post: SwiftUI with UICollectionView - 15. Use @EnvironementObject instead of @State when embedding SwiftUI Views inside of UICollectionViewCell
// MARK: Card
protocol CardContent {
var id: String { get }
var imageName: String { get }
var title: String { get }
var description: String { get }
}
struct Card: View {
typealias Content = CardContent
let content: Content
@EnvironmentObject var heartsProvider: HeartsProvider
var body: some View {
ZStack(alignment: .topTrailing) {
VStack(alignment: .leading, spacing: 8) {
Image(content.imageName)
.fitToAspectRatio(3/2)
.clipShape(RoundedRectangle(cornerRadius: 4))
Text(content.title)
.font(.headline)
Text(content.description)
.font(.body)
.lineLimit(1)
Spacer()
}
HeartButton(isHearted: heartsProvider.isHearted(id: content.id), action: {
self.heartsProvider.toggle(id: content.id)
}).padding()
}
}
}
// MARK: HeartsProvider
import SwiftUI
class HeartsProvider: ObservableObject {
@Published var hearts: [String] = []
func isHearted(id: String) -> Bool {
return hearts.contains(id)
}
func toggle(id: String) {
// ...
}
}
// MARK: App
@main
struct PlaygroundApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(HeartsProvider())
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment