- 숙박 > 호텔 종류 선택
- 식사 > 음식 종류 선택
- 주류 및 간식 > 주류 및 간시 종류 선택
- 교통 > 교통 종류 선택
- 쇼핑 > 쇼핑 종류 선택
- 액티비티 > 액티비티 종류 선택
- Xcode 11.3
- iOS 13.3
- cocoapod
- XLpagerTapStrip
- TinyConstraints
- Moya
- 스크롤뷰 구현
- 비행기 날아가는 애니메이션 구현
- 여행전/여행중으로 현재 상태 구별
- 컬렉션뷰로 인기여행지 도시 구현
- 커스텀바를 이용해 여행전뷰에서 여행중 뷰로 바로 넘어가게 커스텀 구현
- Expandable cell 구현
- Page좌우로 넘어가는 PageTapBarController 완성 (XLTapBar이용)
- 셀 선택시 해당도시로 여행 출발
- 데이트 피커를 통한 데이터 입력
- 출발 날짜와 도작 날짜를 이용해서 , dateFormatter를 이용해서 날짜 사이의 days 기간을 구함.
- 숙박 카테고리, 팝업뷰 통신 구현
- 식사 카테고리, 통신 구현
- 주류 및 간식 카테고리, 통신 구현
- 교통 카테고리(더미) 구현, 키패드 업다운
- 쇼핑 카테고리(더미) 구현, 키패드 업다운
- 액티비티 카테고리 , 테이블 뷰 셀, 통신 구현
- 버튼 클릭 구현
- 예산 히스토리 기능 미구현 (작업중)
- 여해 중 페이지에서 쓴 예산 넘기는 작업 (작업중)
- 여행상세페이지 미구현 (작업중)
- delegate 을 이용한 data 전달 방식 종류
- segue 를 안 이용한 방식 </li
- reusable cell 사용시 버튼 tag 사용
protocol PopUpViewControllerDelegate: class {
func popUpViewController(_ viewController: PopUpViewController, didReceiveData data: String, hotelNumber: Int, day: Int)
}
weak var delegate: PopUpViewControllerDelegate?
delegate?.popUpViewController(self, didReceiveData: String(totalP), hotelNumber: subCategory, day: Day)
let vc = storyboard?.instantiateViewController(withIdentifier: "CategoryFoodViewController") as! CategoryFoodViewController
func activityCell(_ cell: ActivityCellTableViewCell, didTapSelectButton button: UIButton) {
let tag = button.tag
guard let model = responseModel?[button.tag] else { return }
if selectedIndex.contains(tag) { // 재사용된 셀이 이미 선택이되서 active된 상태이면, 선택 해제된 셀을 재사용셀로 사용한다.
- xib로 뷰 구성후
let headerView = UIView.instantiate(CityChooseSection.self)
headerView.foldButton.tag = section
headerView.configure(with: twoDimensionalArray[section].country)
headerView.delegate = self
return headerView
- xib로 뷰 구성하 전 코드로 작성한 Section View
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.width, height: 50))
headerView.backgroundColor = .lightGray
let country = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
country.text = twoDimensionalArray[section].country
country.textAlignment = .center
country.backgroundColor = .cyan
country.width(100)
let button = UIButton(type: .system)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 50)
button.setImage(UIImage(named: "naviBtnBackB"), for: .normal)
button.setImage(UIImage(named: "cursor"), for: .selected)
button.backgroundColor = .clear
button.tintColor = .black
button.width(50)
button.height(50)
button.addTarget(self, action: #selector(handleExpandClose), for: .touchUpInside)
button.tag = section
headerView.addSubview(country)
headerView.addSubview(button)
let underline = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.width, height: 1))
headerView.addSubview(underline)
underline.backgroundColor = .black
country.leadingToSuperview()
country.centerYToSuperview()
button.trailingToSuperview()
button.centerYToSuperview()
underline.height(1)
underline.trailingToSuperview()
underline.leadingToSuperview()
underline.bottomToSuperview()
return headerView
struct DayPlanData {
var day: Int = 0
var array2: [(Int, Int)]
var dayCost: Int = 0
}
데이별로 구조체 배열을 이용해 일별 데이터 관리
```swift
class TotalPlanData: CustomStringConvertible {
static let shared = TotalPlanData()
private init() {}
var startDate: String = ""
var endDate: String = ""
var travelDays: Int = 0
var cityName: String = ""
}
singleton patter을 이용한 전체 데이터 효율적 관리 private init(){} 을 통해 외부 참조 생성 방지