한 카테고리의 화면전환 최대 깊이가 4단계
1화면>2화면>3화면>4화면
4화면에서 어떤 데이터가 없을 경우 1화면으로 초기화해줘야함
예를 들어 간단한 버튼동작으로 구조가 깊지않은 화면전환 시에는 네비게이션 컨트롤러 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상태였기 때문에 화면과 화면이 겹치면서 돌아가는 전환과정이 다 보였던 것
만약 바로 이전 단계로 돌아가게할 경우에는 상단 네비게이션에서 <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()
}
}