[TIL] 식당 예약 어플 개발 - 1일차 -

신승현·2024년 4월 24일

TIL

목록 보기
63/72
post-thumbnail

1️⃣ CollectionView 2개 사용하기


위와 같은 메인화면을 개발하는게 나의 역할이였다.
처음에는 CollectionView를 활용해서 각 Section 별로 Header를 다르게 출력하고, item으로 CollectionView Cell을 출력하려고 했다.

하지만 직접 그려본 결과 item 크기를 상대적으로 원하는 사이즈를 맞추기 어렵기도 했고, item의 위치와 간격을 원하는 대로 배치할 수가 없어서 6시간 이상을 허비했던거 같다.

그래서 위와 같은 화면을 어떻게 구성하는 방법을 구글에서 찾아봤는데, 대부분의 개발자들이 TableView와 CollecctionView를 동시에 사용해서 출력하고 있었다. 이런 방법이 있다는 걸 깨달은 뒤에 나도 TableView를 사용할까 했지만, 이미 작성해놓은 CollectionView의 오토레이아웃과 같은 코드들을 다 날리고 처음부터 다시 작성하긴 시간이 아까워서, CollectionView를 2개를 사용하기로 했다.

하지만 이렇게 2개의 CollectionView를 사용하니 한가지 문제가 생겼다. 셀을 클릭 시, NavigationController가 있는 HomeViewController에서 pushView를 해줘야 하기 때문이다.
왜인지 Delegate를 지정해줘서 해결할 수 있을 것 같다는 느낌이 들었는데, Delegate를 정해진 것만 써봐서 코드로 만드는 것은 감이 잡히지 않았다.
결국 ChatGPT를 써서 이 부분을 해결했다.

protocol HomeCollectionViewCellDelegate: AnyObject {
    func didSelectItemAt(_ cell: HomeCollectionViewCell, indexPath: IndexPath)
}

위의 코드가 Delegate를 생성한 코드다.
아래의 코드는 Delegate 프로토콜을 상속받아 Cell 터치를 구현한 부분이다.

extension HomeViewController: HomeCollectionViewCellDelegate {
    func didSelectItemAt(_ cell: HomeCollectionViewCell, indexPath: IndexPath) {
        
        let storyboard = UIStoryboard(name: "DetailView", bundle: nil)
        
        if let detailViewController = storyboard.instantiateViewController(withIdentifier: "DetailView") as? DetailViewController {
            
            switch cell.cellNumber {
            case 0:
                if let regionRestaurants = NetworkManager.seoulRestaurantData[NetworkManager.seoulLivingArea[indexPath.row]] {
                    let restaurantData = regionRestaurants[Int.random(in: 0..<regionRestaurants.count)]
                    detailViewController.detailRestaurantData = restaurantData
                    detailViewController.setRestaurantImageView(placeName: restaurantData.placeName)
                }
            case 1:
                if let restaurantData = NetworkManager.defaultRestaurantData {
                    detailViewController.detailRestaurantData = restaurantData[indexPath.row]
                    detailViewController.setRestaurantImageView(placeName: restaurantData[indexPath.row].placeName)
                }
            case 2:
                if let restaurantData = NetworkManager.defaultRestaurantData {
                    detailViewController.detailRestaurantData = restaurantData[(restaurantData.count - 1) - indexPath.row]
                    detailViewController.setRestaurantImageView(placeName: restaurantData[(restaurantData.count - 1) - indexPath.row].placeName)
                }
            default:
                return
            }
            
            self.navigationController?.pushViewController(detailViewController, animated: true)
        }
    }
}
profile
개발자

0개의 댓글