Skip to content

Instantly share code, notes, and snippets.

@wilsoncusack
Last active June 30, 2023 23:24
Show Gist options
  • Save wilsoncusack/38f0e5ba0b4b14ea20339e4bfe87c108 to your computer and use it in GitHub Desktop.
Save wilsoncusack/38f0e5ba0b4b14ea20339e4bfe87c108 to your computer and use it in GitHub Desktop.
SwiftUI Reusable View Using Generic Types
struct HorizontalList<Item, Card, Detail>: View where Item: NSManagedObject, Card: View, Detail: View{
var items: FetchedResults<Item>
var card: (Item) -> Card
var detail: (Item) -> Detail
// init(items: FetchedResults<Item>, @ViewBuilder card: @escaping (Item) -> Card, @ViewBuilder detail: @escaping (Item) -> Detail) {
// self.items = items
// self.card = card
// self.detail = detail
// }
var body: some View{
VStack{
ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .bottom, spacing: 10){
ForEach(items, id: \.self){item in
NavigationLink(destination: self.detail(item)){
self.card(item)
}.buttonStyle(PlainButtonStyle())
}
}.padding(.leading, 15)
}
}
}
}
struct LearnerCard: View {
@ObservedObject var learner: Learner
var body: some View {
VStack{
ProfileImage(learner: learner, size: 100)
Text(learner.name)
}
}
}
struct LearnerDetail: View {
@ObservedObject var learner: Learner
var body: some View {
VStack{
ProfileImage(learner: learner, size: 100)
Text(learner.name)
}
.navigationBarTitle(learner.name)
}
}
struct Home: View {
@FetchRequest(fetchRequest: Learner.allLearnersFetchRequest())
var learners: FetchedResults<Learner>
var body: some View {
NavigationView{
HorizontalList(items: learners, card: {learner in LearnerCard(learner: learner)}, detail: {learner in LearnerDetail(learner: learner)})
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment