중간 깊이로 진입한 화면에서의 특정 화면으로의 초기화

임혜정·2024년 9월 6일
0
post-custom-banner

문제상황

한 카테고리의 화면전환 최대 깊이가 4단계
1화면>2화면>3화면>4화면

4화면에서 어떤 데이터가 없을 경우 1화면으로 초기화해줘야함

pushViewController

예를 들어 간단한 버튼동작으로 구조가 깊지않은 화면전환 시에는 네비게이션 컨트롤러 pushViewController를 빈번하게 사용하는데 이 메서드는 vc를 겹쳐쌓아서 보여준다. pushViewController로 1화면에서 2화면으로 전환할 시 눈에 보이진 않지만 1화면 위에 2화면이 올라가있는 거임.

그러나 화면전환 단계가 깊고 계속 pushViewController로 화면전환할 시 화면이 계속 위에 쌓이게되고 메모리 문제가 발생하고, 사용자도 수많은 윈도우창이 열려있는 상태처럼 길을 잃게됨...



이전 화면을 다 제거하자!

화면 전환이 덜덜 거리는 현상도 있었는데 혹시 메모리 문제인가 해서 이전에 쌓인 네비게이션 스택을 제거해주는 메서드를 작성해보았지만

func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        if viewController is 현재화면VC {
            if let index = navigationController.viewControllers.firstIndex(of: viewController) {
                navigationController.viewControllers.removeSubrange(0..<index)
            }
        }
    }
네비게이션 컨트롤러가 새 뷰 컨트롤러를 표시할 때마다 호출
방금 표시된 VC가 현재VC 타입인지 확인하고 타입이 같다면
네비게이션 스택에서 이 뷰 컨트롤러의 인덱스를 찾아 이전 인덱스인 모든 뷰 컨트롤러들을 제거

그러나 이렇게 되면 이전화면이 필요해질 때는 뒤로가기를 사용할 수가 없고 덜덜거리는 전환도 이 문제가 아니고 그저 해당vc의 백그라운드가 .clear상태였기 때문에 화면과 화면이 겹치면서 돌아가는 전환과정이 다 보였던 것



popViewController

만약 바로 이전 단계로 돌아가게할 경우에는 상단 네비게이션에서 <back의 선택지를 줄 수도 잇고 현재화면을 popViewController로 제거해주면 되지만, 이이전화면이거나? 3단계전 화면으로 돌아가야 할 시에는 중간 단계에 열렸던 화면을 다 제거하고 돌아가야 한다.

중간 단계 화면들에서 다 조건식으로 pop해준다면?
그럼 그 VC는 해제되가는 중이기 때문에 더 이상 어떤 동작을 수행할 수가 없음



그냥 처음으로 돌아가자

그러려면? appDelegate나 sceneDelegate에서 사용자가 처음 앱을 설치실행했을 때 메인화면을 접하는 방식처럼 똑같이 해주면 되지.


private func deletePlan() {
        repository.deleteFinancialPlan(financialPlan) 
        
        deleteDelegate?.didDeleteFinancialPlan(financialPlan)
        
        // ❗️모든 데이터가 삭제되었을 경우? = 없을경우 > navigateToSelectionVC호출
        if repository.getAllFinancialPlans().isEmpty {
            showAlert(message: "모든 플랜이 삭제되었습니다.") { [weak self] in
                self?.navigateToSelectionVC()
            }
        } else { // ❗️ 현재 보고있는 데이터만 삭제됐을 경우
            showAlert(message: "플랜이 성공적으로 삭제되었습니다.") { [weak self] in
                self?.navigationController?.popViewController(animated: true)
            }
        }
    }
    
    private func navigateToSelectionVC() {
         let 처음으로돌아가라VC = 돌아갈VC()
            
         // 루트 뷰 컨트롤러부터 시작하여 네비게이션 스택을 재설정
         if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
               let window = windowScene.windows.first {
                window.rootViewController = UINavigationController(rootViewController: 처음으로돌아가라VC)
                window.makeKeyAndVisible()
          }
    }
profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️
post-custom-banner

0개의 댓글