본문 바로가기
iOS/흡구오디

[흡95디] 내 코드 톺아보기 공부하기 - ViewController.swift

by 23g 2025. 2. 20.

안녕하세요

 

이번주에는 기능 추가 구현에 집착하지 않고

내 친구 지피티가 (많이) 도와준 내 코드 잘 이해하고 공부하기!

 

import UIKit // UIKit 프레임워크 가져오기 (UI 관련 기능 제공)
import NMapsMap // 네이버 지도(Naver Maps) SDK 가져오기

class ViewController: UIViewController { // UIViewController를 상속받아 화면 컨트롤러(ViewController) 정의
    
    // MARK: - Properties
    let markerManager = MarkerManager() // 마커를 관리하는 객체 생성
    var popUpVC: PopUpView? // 팝업 뷰를 표시할 객체 (옵셔널)

    @IBOutlet weak var naverMapView: NMFNaverMapView! // 네이버 지도 뷰 연결
    @IBOutlet weak var addMarkerButton: UIButton! // 마커 추가 버튼 연결
    @IBOutlet weak var searchBar: UISearchBar! // 검색 바 연결
    @IBOutlet weak var showListButton: UIButton! // 리스트 보기 버튼 연결
    
    // MARK: - Lifecycle
    override func viewDidLoad() { // 뷰가 로드될 때 실행되는 메서드 (라이프사이클 메서드 중 하나)
        super.viewDidLoad() // 부모 클래스의 viewDidLoad() 호출
        setupNaverMapView() // 네이버 지도 설정 메서드 호출
        loadMarkers() // Firestore에서 마커 데이터 로드
        popUpVC = PopUpView(parentView: self.view) // PopUpView 초기화 및 연결
        NotificationCenter.default.addObserver(self, selector: #selector(reloadMarkers), name: .smokingAreaAdded, object: nil) // 흡연구역이 추가될 때 알림을 받아 reloadMarkers 실행
    }
    
    @objc private func reloadMarkers() { // @objc를 붙여 NotificationCenter에서 호출할 수 있도록 함
        print("✅ 새로운 흡연구역이 추가되어 마커를 새로 불러옵니다.") // 로그 출력
        loadMarkers() // 마커 다시 불러오기
    }
    
    // MARK: - Setup Methods
    private func setupNaverMapView() { // 네이버 지도 초기 설정을 수행하는 메서드
        let initialLocation = NMGLatLng(lat: 37.500920152198, lng: 127.03618231961) // 초기 위치 설정 (위도, 경도 지정)
        let cameraUpdate = NMFCameraUpdate(scrollTo: initialLocation) // 카메라 이동 설정
        naverMapView.mapView.moveCamera(cameraUpdate) // 카메라 이동 실행
        naverMapView.showLocationButton = true // 현재 위치 버튼 표시
    }

    // MARK: - Firestore 데이터 불러와서 마커 추가
    private func loadMarkers() { // Firestore에서 마커 정보를 가져오는 메서드
        FirestoreManager.shared.fetchSmokingAreas { [weak self] smokingAreas in // Firestore에서 흡연구역 데이터를 가져옴
            guard let self = self else { return } // self가 nil이면 함수 종료
            self.markerManager.addMarkers(for: smokingAreas, to: self.naverMapView.mapView, viewController: self) // 지도에 마커 추가
        }
    }

    // MARK: - 팝업 정보 표시
    func showPopUpInfo(for smokingArea: SmokingArea) { // 특정 흡연구역 정보를 팝업으로 표시하는 메서드
        popUpVC?.showInfo(for: smokingArea) // PopUpView에서 정보 표시
    }

    // MARK: - Actions
    @IBAction func addMarkerButtonTapped(_ sender: UIButton) { // 마커 추가 버튼을 눌렀을 때 실행되는 메서드
        let storyboard = UIStoryboard(name: "Main", bundle: nil) // Main.storyboard 가져오기
        if let addVC = storyboard.instantiateViewController(withIdentifier: "AddSmokeAreaViewController") as? AddSmokeAreaViewController { // AddSmokeAreaViewController 인스턴스 생성
            addVC.modalPresentationStyle = .fullScreen // 전체 화면으로 표시 설정
            present(addVC, animated: true, completion: nil) // 화면 전환 실행
        } else {
            print("AddSmokeAreaViewController를 찾을 수 없음") // 오류 발생 시 로그 출력
        }
    }
    
    @IBAction func showListButtonTapped(_ sender: UIButton) { // 리스트 보기 버튼을 눌렀을 때 실행되는 메서드
        let storyboard = UIStoryboard(name: "Main", bundle: nil) // Main.storyboard 가져오기
        if let listVC = storyboard.instantiateViewController(withIdentifier: "ListViewController") as? ListViewController { // ListViewController 인스턴스 생성
            listVC.modalPresentationStyle = .fullScreen // 전체 화면으로 표시 설정
            present(listVC, animated: true, completion: nil) // 화면 전환 실행
        } else {
            print("ListViewController를 찾을 수 없음") // 오류 발생 시 로그 출력
        }
    }
}

 

뷰컨 파일 공부 완~