위의 코드는 updateQuantityHandler안에서 호출되는updatePriceLabel 메서드의 내용이다.
화면에 주문 수량과 가격을 업데이트 해주기 위한 메서드이다.
👉 이렇게 진행해줬다면 스텝퍼로 값이 변경될 때마다 orderArray의 값이 변경되고 변경된 값이 화면에 잘 뿌려지는 것을 확인할 수 있을 것이다. 이제 총 주문 개수와 총 가격을 출력해보자!
총 주문 개수 및 가격 표시
1) updateTotal() 총 가격 설정 메서드
func updateTotal() {
var totalCount = 0
var totalPrice = 0
for order in orderArray {
totalCount += order.quantity
totalPrice += (order.menu.price) * (order.quantity)
}
orderTotalCount.text = "\(totalCount)"
orderTotalPrice.text = "₩\(totalPrice)"
}
orderArray인 주문 배열의 모든 주문 항목을 순회하면서 총 주문 수량과 주문 가격을 계산하고 화면에 업데이트 해주는 메서드이다.
처음 뷰가 로드될 때, 데이터가 수정이 되었을 때 등 필요한 시점에 해당 메서드를 호출해주면 된다!
셀 삭제 기능
1) cell 삭제: UITableViewDelegate
셀을 옆으로 스와이프해서 삭제
Edit Mode 활용하여 구현
// MARK: - cell 삭제
// 셀 편집 여부를 설정
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
// 사용자가 셀을 삭제할 때 호출됩니다.
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// 삭제하려는 셀의 인덱스
let index = indexPath.row
// 데이터 소스에서 셀 삭제
orderArray.remove(at: index)
// 테이블 뷰에서 셀 삭제
tableView.deleteRows(at: [indexPath], with: .automatic)
updateTotal()
}
}
}
canEditRowAt 메서드를 사용하여 각 셀을 편집 가능하게 만들고 그런 다음, 사용자가 삭제를 확정할 때 호출되는 commit editingStyle 메서드를 구현했다. 셀을 삭제했을 땐 해당 셀의 데이터가 orderArray에서도 제거되고, 테이블 뷰에서도 셀이 삭제된다.
그리고 삭제된 셀을 제외한 나머지 주문 정보들로부터 다시 총 가격을 계산하여 업데이트 한다.
2) 전체 삭제 버튼 Alert Action
전체 삭제 버튼을 눌렀을 때 모든 주문을 삭제하고 총 가격 업데이트
// MARK: - 전체 삭제 버튼
@IBAction func tapDeleteButton(_ sender: UIButton) {
let alert = UIAlertController(title: nil, message: "장바구니를 비우시겠습니까?", preferredStyle: .alert)
// 확인 액션(삭제)
let delete = UIAlertAction(title: "확인", style: .default) { (_) in
// 주문 배열 비우기
self.orderArray.removeAll()
// 테이블 뷰 리로드
self.orderListTableView.reloadData()
// 총 가격 업데이트
self.updateTotal()
print(self.orderArray)
}
let cancel = UIAlertAction(title: "취소", style: .cancel)
alert.addAction(delete)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
위 코드에서는 확인 액션을 선택하면 주문 배열을 비우고 테이블뷰를 리로드하여 모든 셀을 삭제하도록 구현했다.
알림창은 UIAlertAction을 사용했고 다시 updateTotal 메서드를 호출해서 총 가격을 업데이트 해주기!
3) 결제하기 버튼 Alert Action
결제하기 버튼을 누르면 주문이 완료되고 장바구니가 비워지며, 사용자에게 알림이 표시
// MARK: - 결제하기 버튼
@IBAction func tapPaymentButton(_ sender: UIButton) {
let alert = UIAlertController(title: nil, message: "결제하시겠습니까?", preferredStyle: .alert)
// 확인 액션
let confirmAction = UIAlertAction(title: "확인", style: .default) { (_) in
// 주문을 결제하고 장바구니 비우기
self.orderArray.removeAll()
// 테이블 뷰 리로드
self.orderListTableView.reloadData()
// 총 가격 업데이트
self.updateTotal()
// 결제 완료 알림창 표시
let paymentCompletedAlert = UIAlertController(title: "결제 완료", message: "주문이 성공적으로 결제되었습니다.", preferredStyle: .alert)
let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
paymentCompletedAlert.addAction(okAction)
self.present(paymentCompletedAlert, animated: true, completion: nil)
}
// 취소 액션
let cancelAction = UIAlertAction(title: "취소", style: .cancel)
// 알림창에 액션 추가
alert.addAction(cancelAction)
alert.addAction(confirmAction)
// 알림창 표시
self.present(alert, animated: true, completion: nil)
}
전체 취소 버튼과 동일하게 UIAlertAction사용해서 알림창 표시되도록 구현했다.
이렇게 하면 요구사항은 전부 적용되었다. .🥹
시연 화면
순서대로 화면 첨부했다.
수량 변경 ➡️ 셀 삭제 및 전체 삭제 ➡️ 결제하기 버튼 이벤트
💬 느낀 점
push전 commit 여러번 하기 (작업한 내용 실수해도 복구할 수 있도록..!🥹)
전에 과제로 했던 투두리스트 앱과 굉장히 비슷해서 로직 짜는 과정을 더 재밌게 작업할 수 있었다.