Project/MovieClip (54) 썸네일형 리스트형 👤 Firebase에 로그인, 회원정보를 FireStore 저장, 회원정보 불러오기 ✅ 로그인 기능 구현 /// 이메일과 비밀번호로 로그인하는 함수func loginUser(email: String, password: String) -> AnyPublisher { return Auth.auth().signIn(withEmail: email, password: password) .map(\.user) // ✅ authResult?.user 만 추출 .eraseToAnyPublisher()}✅ 특징✔️ signIn(withEmail:password:)는 원래 Future 형태로 제공됨 → 따로 감쌀 필요 없음✔️ map(\.user)를 사용해 authResult?.user만 반환하여 더 간결한 코드✔️ .eraseToAnyPublisher()로.. 👤 Firebase에 이메일 & 비밀번호 회원가입 기능 (MVVM + Combine) 🔷 SceneDelegate.swift🏆 전체 흐름 정리1️⃣ 앱이 실행되면 scene(_:willConnectTo:options:)이 호출됨.2️⃣ setupWindow()를 통해 UIWindow를 초기화하고, 화면을 표시할 준비를 함.3️⃣ checkAuthentication()에서 현재 로그인 상태를 확인함.로그인이 안 되어 있다면 gotoController(with: OnboardingViewController()) 실행로그인이 되어 있다면 gotoController(with: MainTabBarController()) 실행4️⃣ gotoController(with:)가 rootViewController를 변경하고 애니메이션을 적용하여 화면을 전환함.class SceneDelegate: UIR.. 🌟 회원 가입 화면 뷰 관리? 순서?는 어떻게 해야하나? ✅ 현재 코드의 흐름📌 회원가입 성공 시RegisterViewController에서 회원가입이 성공하면 현재 띄워진 모든 모달을 닫음 (dismiss())NotificationCenter를 사용해 SceneDelegate에게 회원가입 성공을 알림 (CreateUserSuccess)SceneDelegate에서 checkAuthentication() 실행checkAuthentication()에서 window?.rootViewController를 MainTabBarController로 변경✔️ 지금 코드의 장점✅ 앱의 전체적인 화면 이동을 SceneDelegate에서 관리해서 중앙 집중식 제어 가능✅ NotificationCenter를 사용해 뷰 컨트롤러 간 의존성을 줄임class SceneDelegate:.. ❌ 문제 해결 - 검색 결과의 상세페이지 이동이 안됨.. ✅ NavigationController에서 push가 안 되는 이유 & 해결 방법🚀 현재 didSelectItemAt은 잘 호출되고 있지만, pushViewController가 동작하지 않는 문제👉 이유: SearchResultViewController는 UISearchController의 searchResultsController로 설정되어 있어서 네비게이션 스택에 포함되지 않음!👉 따라서 pushViewController가 동작하지 않음! 🔥 해결 방법: navigationController로 감싸서 Push 가능하게 만들기✅ 1. present()가 아니라 pushViewController()를 사용하고 싶다면?✔ DetailViewController를 UINavigationControll.. 🔨 검색결과 내의 영화, 티비의 장르 가져오는 부분 개선 📍 현재 장르 정보가 늦게 나옴... (좌측) / 이제는 잘 나옴 (우측)✅ 검색 결과에서 장르 정보를 가져오는 코드 검토 & 개선점class SearchViewModel: ObservableObject { ... @Published var fetchedGenres: [Int: [String]] = [:] // 장르 저장 변수 // MARK: - 검색 실행 func search(query: String) { currentQuery = query resetState() Task { do { let results = try await searchServ.. 🔥 MVVM + Combine을 통한 검색기능 구현 2편 구현 순서? ✅ MVVM + Combine + UISearchViewController를 사용한 검색 기능 구현 순서 📍 Network 설정 TMDB API를 통해 데이터를 가져올 함수 구현// MARK: - APICallerclass NetworkManager { static let shared = NetworkManager() ... // MARK: - Search /// 검색어를 통해 영화 목록 결과 func searchMovie(with keyword: String, page: Int = 1) async throws -> SearchResultMedia { let url = URL(string: "\(Constants.base.. 🤔 createDataSource() 메서드에서 "검색 결과 전체보기" 버튼 동작 🔹 1. SearchFooterView의 역할📌 SearchFooterView는 UICollectionView의 각 섹션(영화, TV, 인물) 하단에 추가되는 버튼을 포함하는 뷰📌 "검색 결과 전체보기" 버튼을 누르면, 추가 데이터를 로드할 수 있도록 loadMoreAction 클로저를 실행하는 구조class SearchFooterView: UICollectionReusableView { // MARK: - Variable static let reuseIdentifier: String = "SearchFooterView" private var loadMoreAction: (() -> Void)? // MARK: - UI Component let.. 🤔 reloadData() 함수의 역할 및 동작 방식 ✅ reloadData() 함수의 역할 및 동작 방식이 함수가 실행되면 UICollectionViewDiffableDataSource를 업데이트하여 최신 검색 결과를 UI에 표시 🔹 1. reloadData() 함수의 전체적인 흐름private func reloadData() { // 📌 새로운 snapshot을 생성하여 기존 데이터를 리셋 var snapshot = NSDiffableDataSourceSnapshot() if !viewModel.movies.isEmpty { // 📌 movies 데이터가 있다면 .movie 섹션을 추가 (tvShows, people 동일) snapshot.appendSections([.movie]) .. 이전 1 2 3 4 5 ··· 7 다음