힘들다.
오늘은 하루종일 과제를 진행했다. 오늘의 주된 구현은 모달을 통한 InventoryViewController이다. 기존의 MainView에서 인벤토리 버튼을 클릭할 시 모달이 나타나며, 표시되는 아이템은 본인이 구매한 아이템이다.
기본적인 커스텀셀 설정, 테이블뷰 생성, 컨트롤러 연결과 같은 내용들은 제외하고 필요한 내용들만 정리한다.
var inventoryItemList: [PurchaseItem] = [] // 구매한 아이템을 받아 놓을 배열
inventoryViewController.inventoryItemList = Array(purchaseItemList.values) // 구매한 딕셔너리에서 values만 뽑아서 줌
extension InventoryViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return inventoryItemList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! InventoryItemCell
let purchaseItem = inventoryItemList[indexPath.row]
cell.config(with: purchaseItem)
return cell
}
}
protocol InventoryViewDelegate: AnyObject {
func didTapSellAllButton()
}
weak var delegate: InventoryViewDelegate?
extension InventoryView {
private func setAction() {
sellAllButton.addTarget(self, action: #selector(sellAllButtonTapped), for: .touchUpInside)
}
@objc
private func sellAllButtonTapped() {
delegate?.didTapSellAllButton()
}
}
extension InventoryViewController {
private func setDelegate() {
inventoryView.delegate = self
}
}
extension InventoryViewController: InventoryViewDelegate {
func didTapSellAllButton() {
let alert = UIAlertController(title: "전체 판매", message: "아이템을 전부 판매하시겠습니까?", preferredStyle: .alert)
let cancel = UIAlertAction(title: "취소하기", style: .cancel)
let confirm = UIAlertAction(title: "판매하기", style: .destructive) { [weak self] _ in
self?.sellAllItem()
}
alert.addAction(cancel)
alert.addAction(confirm)
present(alert, animated: true)
}
func sellAllItem() {
self.inventoryItemList.removeAll()
self.inventoryView.inventoryTableView.reloadData()
}
}
방금까지 완성한 기능으로는 인벤토리의 데이터가 완전히 지워지지않는다. 정확하게 말하자면, 원본 데이터는 살아있기 때문에, 다시 채워지는 현상이 발생한다. 이를 위해 InventoryViewController와 ViewController 간의 delegate를 정의하여 원본 배열도 지워질 수 있도록 해야한다.
1. InventoryViewController에 delegate를 선언하고 메서드를 정의하자.
protocol InventoryViewControllerDelegate: AnyObject {
func didUpdateInventoryItemList()
}
weak var delegate: InventoryViewControllerDelegate?
func sellAllItem() {
self.inventoryItemList.removeAll()
self.inventoryView.inventoryTableView.reloadData()
delegate?.didUpdateInventoryItemList()
}
func didTapInventoryButton() {
print("인벤토리 버튼 선택")
let inventoryViewController = InventoryViewController()
inventoryViewController.inventoryItemList = Array(purchaseItemList.values) // 구매한 딕셔너리에서 values만 뽑아서 줌
inventoryViewController.delegate = self
self.present(inventoryViewController, animated: true)
}
extension ViewController: InventoryViewControllerDelegate {
func didUpdateInventoryItemList() {
self.purchaseItemList.removeAll()
}
}
현재까지 완성된 전체판매 기능은 사실 판매라기보단 삭제 기능에 가깝다. 현재 보유한 메소를 사용하고, 판매로 인해 다시 추가되는 기능이 구현되어있지 않기 때문에 이를 내일 수정해야할 것이며, 전체 삭제라면 didUpdateInventoryItemList라는 메서드명보다 didRemoveInventoryItemList라는 메서드명이 더 낫다고 생각이 들 수 있다. 구현을 진행하며 구상했던 방법으로 InventoryViewController에서 ViewController로 배열이 변경되었다고 알려주는 것은 전체삭제, 개별삭제를 묶어서 할 수 있지 않을까 생각해서 remove보다는 update로 적용했다.