diff --git a/ThrowAway/ThrowAway.xcodeproj/project.pbxproj b/ThrowAway/ThrowAway.xcodeproj/project.pbxproj index 90dbe47..47dbb81 100644 --- a/ThrowAway/ThrowAway.xcodeproj/project.pbxproj +++ b/ThrowAway/ThrowAway.xcodeproj/project.pbxproj @@ -144,9 +144,10 @@ 3A34127829164FB000BDFB34 /* StaticsView */ = { isa = PBXGroup; children = ( + 3A34128429164FE900BDFB34 /* StatisticsView.swift */, + 3A34127929164FC100BDFB34 /* CalendarManager.swift */, 3A34127B29164FC600BDFB34 /* Model */, 3A34127C29164FCB00BDFB34 /* View */, - 3A34127929164FC100BDFB34 /* CalendarManager.swift */, ); path = StaticsView; sourceTree = ""; @@ -166,7 +167,6 @@ 3A34128129164FE900BDFB34 /* CalendarView.swift */, 3A34128329164FE900BDFB34 /* DateScrollView.swift */, 3A34128229164FE900BDFB34 /* DayOfWeekView.swift */, - 3A34128429164FE900BDFB34 /* StatisticsView.swift */, ); path = View; sourceTree = ""; diff --git a/ThrowAway/ThrowAway/SwiftUI/StaticsView/StatisticsView.swift b/ThrowAway/ThrowAway/SwiftUI/StaticsView/StatisticsView.swift new file mode 100644 index 0000000..3cab1a0 --- /dev/null +++ b/ThrowAway/ThrowAway/SwiftUI/StaticsView/StatisticsView.swift @@ -0,0 +1,90 @@ +// +// StatisticsView.swift +// ThrowAway +// +// Created by 지준용 on 2022/10/30. +// + +import SwiftUI + +struct StatisticsView: View { + + @EnvironmentObject var dateHolder: DateHolder + @Environment(\.managedObjectContext) private var viewContext + + @FetchRequest( + sortDescriptors: [NSSortDescriptor(keyPath: \Product.cleaningDay, ascending: true)], + animation: .default + ) + private var products: FetchedResults + + private let setWidth = UIScreen.main.bounds.width + private let screenWidth = UIScreen.main.bounds.width + + var body: some View { + VStack { + VStack { + DateScrollView() + .environmentObject(dateHolder) + + Text("이번 달의 달성도는 81%입니다.") + .padding(.vertical, 20) + .font(.system(size: 20)) + + DayOfWeekView() + CalendarView() + } + .padding(.horizontal, 16) + + // TODO: 조건에 맞는 물건을 coredata에서 불러오기 + let notYetCleaningProducts = products.filter{ $0.isCleanedUp == false } + let lateCleanedUpProducts = products.filter{ $0.isCleanedUp == false } + + makeSectionView(label: "버리지 못한 물건", products: notYetCleaningProducts) + makeSectionView(label: "늦게 버린 물건", products: lateCleanedUpProducts) + } + } + + private func makeSectionView(label: String, products: [Product]) -> some View { + VStack(alignment: .leading) { + HStack { + Text("\(label)(\(products.count))") + .font(.system(size: 18)) + .fontWeight(.semibold) + .padding(.top, 10) + Spacer() + } + makeHorizontalScrollView(from: products) + } + .padding(.leading, 16) + } + + private func makeHorizontalScrollView(from products: [Product]) -> some View { + let items: [(id: ObjectIdentifier, image: Image)] = products.map { product in + var image = Image(systemName: "photo") + if (product.photo != nil), let photo = Image(data: product.photo!) { + image = photo + } + return (product.id, image: image) + } + + return ScrollView(.horizontal) { + HStack { + ForEach(items, id: \.self.id) { item in + item.image + .resizable() + .frame(width: screenWidth / 6, height: screenWidth / 6, alignment: .center) + .aspectRatio(contentMode: .fit) + .clipShape(Circle()) + } + } + } + } +} + +private extension Image { + init?(data: Data) { + guard let image = UIImage(data: data) else { return nil } + self = .init(uiImage: image) + } +} diff --git a/ThrowAway/ThrowAway/SwiftUI/StaticsView/View/StatisticsView.swift b/ThrowAway/ThrowAway/SwiftUI/StaticsView/View/StatisticsView.swift deleted file mode 100644 index 03b0546..0000000 --- a/ThrowAway/ThrowAway/SwiftUI/StaticsView/View/StatisticsView.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// StatisticsView.swift -// ThrowAway -// -// Created by 지준용 on 2022/10/30. -// - -import SwiftUI - -struct StatisticsView: View { - var notThrowArray = ["Test01", "Test02", "Test03", "Test04"] - var lateThrowArray = ["Test01", "Test02", "Test03"] - let setWidth = UIScreen.main.bounds.width - let screenWidth = UIScreen.main.bounds.width - - @EnvironmentObject var dateHolder: DateHolder - - var body: some View { - VStack { - VStack { - DateScrollView() - .environmentObject(dateHolder) - - Text("이번 달의 달성도는 81%입니다.") - .padding(.vertical, 20) - .font(.system(size: 20)) - - DayOfWeekView() - CalendarView() - } - .padding(.horizontal, 16) - - ProductArrayView(text: "버리지 못한 물건", productArray: notThrowArray) - ProductArrayView(text: "늦게 버린 물건", productArray: lateThrowArray) - } - } - - func ProductArrayView(text: String, productArray: [String]) -> some View { - VStack(alignment: .leading) { - HStack { - Text("\(text)(\(productArray.count))") - .font(.system(size: 18)) - .fontWeight(.semibold) - .padding(.top, 10) - Spacer() - } - productScroll(productArray: productArray) - } - .padding(.leading, 16) - } - - func productScroll(productArray: [String]) -> some View { - ScrollView(.horizontal) { - HStack { - ForEach(productArray, id: \.self) {product in - Image(product) - .resizable() - .frame(width: screenWidth / 6, height: screenWidth / 6, alignment: .center) - .aspectRatio(contentMode: .fit) - .clipShape(Circle()) - } - } - } - } -} diff --git a/ThrowAway/ThrowAway/View Controllers/TabBarViewController.swift b/ThrowAway/ThrowAway/View Controllers/TabBarViewController.swift index 3713955..6c5f94d 100644 --- a/ThrowAway/ThrowAway/View Controllers/TabBarViewController.swift +++ b/ThrowAway/ThrowAway/View Controllers/TabBarViewController.swift @@ -21,13 +21,15 @@ class TabBarViewController: UITabBarController { } func setupVCs() { + let viewContext = persistence.container.viewContext let storyboard = UIStoryboard(name: "ProductList", bundle: nil) let productListVC = storyboard.instantiateViewController(withIdentifier: "ProductListViewController") as! ProductListViewController - productListVC.viewContext = persistence.container.viewContext + productListVC.viewContext = viewContext - // date holder - let staticsView = StatisticsView().environmentObject(DateHolder()) + let staticsView = StatisticsView() + .environment(\.managedObjectContext, viewContext) + .environmentObject(DateHolder()) let staticsVC = UIHostingController(rootView: staticsView) let settingVC = UIHostingController(rootView: SettingView())