SwiftUI프로그래밍

[SwiftUI] 아이패드에서 뒤로가기 버튼 혹은 닫기 버튼이 안보일때 (NavigationStack + NavigationLink)

이미지와 설명을 보면, iPad에서 NavigationStack을 쓰고 있지만 “뒤로가기 버튼”이 안 보이는 문제가 발생하고 있다. NavigationStack 또는 NavigationSplitView 구조에서 자주 발생한다고 하네?

근데 글씨가 안보이지, 버튼은 존재하는 상태이다. 버튼이 있을만한 위치를 클릭하면 닫히기 때문이다.


✅ 원인

iPad의 NavigationStack 또는 NavigationView는 다크 모드 또는 특정 커스텀 색상 조합일 때:

  • 기본 NavigationBarback button 색상 (tintColor)배경색과 같거나 유사할 경우,
  • 실제로 버튼이 있는 위치는 클릭되지만 사용자에게 보이지 않음.

🎯 해결 방법: 탐색 바의 tintColor 명시 설정

NavigationStack 또는 NavigationView.tint(...) 수정자를 추가해서 버튼 색상을 명시하면 해결됩니다.

예시:

NavigationStack {
    YourView()
        .navigationTitle("PIN 변경")
        .navigationBarTitleDisplayMode(.inline)
}
.tint(.white) // 혹은 .primary, .blue 등 잘 보이는 색

이렇게 하면 뒤로가기 버튼 아이콘 및 텍스트의 색상이 강제로 바뀝니다.



🎯 버튼이 존재하지 않는 다면? 문제 요약

  • iPad에서 NavigationStack을 사용 중.
  • 화면을 NavigationLink로 푸시했지만, 뒤로가기 버튼이 보이지 않음.
  • 특히 탭바 UI와 중첩되었을 경우 iPad는 full-screen push가 안 되고 “side-by-side” 구조처럼 렌더링됨.

✅ 해결 방법

1. NavigationSplitView를 쓰고 있는 경우라면?

  • DetailViewnavigationBarBackButtonHidden(true)가 기본으로 적용됨.
  • 직접 dismiss 버튼을 만들어야 합니다.
@Environment(\.dismiss) var dismiss

Button(action: {
    dismiss()
}) {
    Label("뒤로가기", systemImage: "chevron.left")
}


2. NavigationStack + NavigationLink 사용하는 경우라면?

조건:

  • NavigationStack 안에서 NavigationLink로 화면을 push하고 있음
  • iPad에서는 이게 자동으로 full-screen push가 아니라 split 모드처럼 동작할 수 있음

해결책:

  • iPad에서도 명시적으로 full-screen push되게 만들려면 .navigationSplitViewStyle(.balanced).navigationBarBackButtonHidden(false)를 명시하거나
  • 화면 전환을 sheet, fullScreenCover, popover로 변경하는 것도 고려해야 함

🎯 가장 안정적인 해결 방법: dismiss() 버튼 직접 추가

import SwiftUI

struct PinChangeView: View {
    @Environment(\.dismiss) var dismiss

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            HStack {
                Button {
                    dismiss()
                } label: {
                    Image(systemName: "chevron.left")
                        .font(.title2)
                        .foregroundColor(.primary)
                }
                Text("설정")
                    .font(.headline)
            }

            Text("PIN 번호 변경")
                .font(.largeTitle.bold())

            // 나머지 PIN 입력 폼...
        }
        .padding()
    }
}

✳️ 참고 팁

  • NavigationSplitViewNavigationStack을 iPad에서 쓸 때는 항상 명시적인 탐색 흐름 관리가 필요.
  • 기본 back 버튼을 기대하지 말고, 직접 dismiss 버튼 추가하는 걸 권장.

error: Content is protected !!