-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #15 from boostcampwm-2022/feature/BrowseCell
Browse cell 일부 구현
- Loading branch information
Showing
9 changed files
with
405 additions
and
234 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
77 changes: 77 additions & 0 deletions
77
DailyQuest/DailyQuest/Presentation/Browse/View/BrowseViewController.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// | ||
// BrowseViewController.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/11/15. | ||
// | ||
|
||
import UIKit | ||
|
||
import RxSwift | ||
import RxCocoa | ||
|
||
final class BrowseViewController: UITableViewController { | ||
private var viewModel: BrowseViewModel! | ||
private var disposableBag = DisposeBag() | ||
|
||
// MARK: - Life Cycle | ||
static func create(with viewModel: BrowseViewModel) -> BrowseViewController { | ||
let view = BrowseViewController() | ||
view.viewModel = viewModel | ||
return view | ||
} | ||
|
||
override func viewDidLoad() { | ||
super.viewDidLoad() | ||
|
||
configure() | ||
bind() | ||
} | ||
|
||
/** | ||
table view의 기본 정보를 설정합니다. | ||
*/ | ||
private func configure() { | ||
// 셀 사이사이의 구분선을 제거합니다. | ||
tableView.separatorStyle = .none | ||
|
||
tableView.allowsSelection = false | ||
|
||
// 델리게이트와 데이터소스를 rx로 재설정합니다. | ||
tableView.delegate = nil | ||
tableView.dataSource = nil | ||
tableView.rx.setDelegate(self).disposed(by: disposableBag) | ||
|
||
// BrowseCell을 등록합니다. | ||
tableView.register(BrowseCell.self, forCellReuseIdentifier: BrowseCell.reuseIdentifier) | ||
} | ||
|
||
private func bind() { | ||
viewModel | ||
.data | ||
.bind(to: tableView.rx.items(cellIdentifier: BrowseCell.reuseIdentifier, cellType: BrowseCell.self)) { row, item, cell in | ||
cell.setup(with: BrowseItemViewModel(user: item.0, quests: item.1)) | ||
} | ||
.disposed(by: disposableBag) | ||
} | ||
} | ||
|
||
extension BrowseViewController { | ||
/** | ||
하나의 BrowseCell의 크기를 결정합니다. BrowseCell내의 QuestCell의 개수만큼 크기가 늘어납니다. | ||
+20은 margins으로 인해 추가된 값입니다. | ||
*/ | ||
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { | ||
return (75.0 * CGFloat(viewModel.cellCount[indexPath.row])) + 20 + 75 | ||
} | ||
|
||
/** | ||
viewModel에서 총 몇개의 BrowseCell을 만들어야하는지 결정합니다. | ||
viewModel에는 UseCase를 통해 들어온 (User, [Quest]) 데이터에서 퀘스트의 **길이** 정보를 담는 프로퍼티(정ㅅ배열)가 있어야 합니다. | ||
Note. 여기에서는 Quest 정보 자체가 필요하진 않습니다. 해당 배열의 아이템들은 위에서 사용할, BrowseCell의 크기를 결정하고, | ||
배열 자체의 길이는 이 메서드의 결과를 결정합니다. | ||
*/ | ||
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | ||
return viewModel.cellCount.count | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseItemViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// | ||
// BrowseCellItemModel.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
|
||
final class BrowseItemViewModel { | ||
let user: User | ||
let quests: [Quest] | ||
|
||
init(user: User, quests: [Quest]) { | ||
self.user = user | ||
self.quests = quests | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// | ||
// BrowseViewModel.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
|
||
import RxSwift | ||
|
||
final class BrowseViewModel { | ||
let user1 = User(uuid: UUID(), nickName: "jinwoong", profile: Data(), backgroundImage: Data(), description: "") | ||
let quests1 = [ | ||
Quest(title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 2, totalCount: 5), | ||
Quest(title: "코딩하기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 0, totalCount: 10) | ||
] | ||
|
||
let user2 = User(uuid: UUID(), nickName: "someone", profile: Data(), backgroundImage: Data(), description: "") | ||
let quests2 = [ | ||
Quest(title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 5), | ||
Quest(title: "책읽기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 9, totalCount: 20), | ||
Quest(title: "달리기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 9), | ||
Quest(title: "잠자기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 1) | ||
] | ||
|
||
let data: Observable<[(User, [Quest])]> | ||
|
||
let cellCount = [2, 4] | ||
|
||
init() { | ||
self.data = .just([(user1, quests1), (user2, quests2)]) | ||
} | ||
} | ||
|
||
/** | ||
Usecase | ||
- fetching quests, it contains user and his quests. | ||
*/ |
Oops, something went wrong.