# NavigationView

SwiftUI View transition strategy
(주의) 이 글은 최소 배포 버전 iOS 14 를 기준으로 구성하였다. 만약 iOS 16 이상으로 잡았다면 NavigationStack 이라는 좋은 녀석이 있다. 요즘 한동안 팔자에는 없겠다 싶었던 SwiftUI 로 프로젝트를 진행하게 되었다. (사람 일이라는게 정말 한치 앞도 모른다더니 정말이었다) SwiftUI 는 선언형 문법을 이용해 뷰를 만든다는 장점 아닌 단점이 있다. 그리고 뷰 클래스들이 모두 뷰 구조체로 바뀌었으며, 뷰 구조체 내부의 상태값 프로퍼티 (Swift Combine 을 응용한 어노테이션 사용) 들을 계속 Observe 하며 자신의 상태/레이아웃/라이프 사이클을 바꾼다. 여기서 앞으로 계속 언급할 얘기가 있다. > SwiftUI 는 모든 뷰 상태값을 뷰 내부에서 정의해야 한다 여기까지 언급하면 iOS 개발을 많이 해본 분

[iOS / SwiftUI] NavigationStack 알아보기 in WWDC22
안녕하세요 Niro 입니다! WWDC22 에서 SwiftUI 에 대한 큰 변화가 이루어졌어요. 그중에서도 기존의 NavigationView 가 없어지게 되고 NavigationStack 과 NavigationSplitView 가 새로 생겼습니다. 여러 변화 중 이번 글에선 WWDC22 영상을 통해 NaviagationStack 을 살펴볼 예정입니다. The SwiftUI cookbook for navigation 편에서는 레시피를 알려주는 App 으로 navigation 을 가장 잘 활용할 수 있도록 설명을 하고 있으니 참고해주세요! > NavigationSplitView 경우 iPad 나 Mac 에서 다중 열을 다룰 때 사용하기 좋기 때문에 따로 다루지 않겠습니다. <b
Tab안에 Navi? 혹은 Navi 안에 Tab?
이번에 Jwords를 만들면서 탭뷰를 도입하게 되었습니다. 오늘 학습할 단어리스트와 전체 단어리스트를 구분하게 위해서 인데요. 이 과정에서 갈림길에 마주치게 되었습니다. 탭뷰 안에 네비게이션 뷰를 넣을 것인가 아니면 네비게이션 뷰를 넣을 것인가인데요. 각각의 방법의 차이를 예제를 통해 알아보도록 하겠습니다. 코드 Tab 안에 Navi Navi 안에 Tab 특징 Navigation Title(and BarButton) Tab 안에 Navi: Tab 마다 각각의 Navigation Title을 가질 수 있다. 내부에 NavigationView가 각각 있기 때문에 안에 있는 NavigationLink가 NavigationView 안에서의 가장 상위 View가 됩니다. NavigationTitle은 NavigationView 안에 있는 가장 상위 View인 각각의 NavigationLink에 서로 다른 navigation title을 줄 수
TabView에 onTapGesture 쓰지 말자!
TabView에 onTapGesture을 사용하면 안되는 이유 예전에 썼던 코드를 보다가 우연히 발견하게 된 버그인데요. 뭔가 바보 같아 보이지만😅 포스팅으로 남기고 싶어 남겨봅니다. TabView에서 어떤 Tab이 선택되었는지 알기 위해서 selection에 binding 변수(아래 코드에서 $selectedTab)를 전달하는 경우가 있습니다. 이런 경우에는 tag에 해당 탭이 선택되었을 때 selectedTab에 어느 값으로 변경되어야 하는지 전달해야 합니다. 저는 아무 생각없이😝 각각의 TabView에 onTapGesture로 selectedTab을 변경시키는 코드를 넣었습니다. 그리고 각각의 Tab은 NavigationView로 구성되어 있습니다. 즉 TabView 안에 NavigationView가 있는 것이죠. 그리고 그 NavigationView 안에는 NavigationLink가 하나 있습니다. 발생한 버그 그랬더니 아래와 같은 버그가 발생했습니다

[SwiftUI] FocusState loses focus
Problem 원했던 결과물은 위와 같다. 안 보이던 TextField 를 보이게 함과 동시에 focus 되게 하여 키보드가 올라오도록 하는 것이다. 그러나 앱에서는 테스트와 다르게 위와 같은 상황이 펼쳐졌다. Why? @FocusState 가 iOS15 에서 도입된 개념이다보니 버그가 꽤 있는 것 같지만 자료는 많이 없다. 그래서 여러 테스트를 혼자 해보면서 문제를 일으키는 위치는 찾을 수 있었다. NavigationView 와 FocusState 와 if 에 있다. Code 잘 작동하는 테스트

[Ch16] Using the Navigation View
Navigation View를 통해 여러 화면을 넘나들 수 있음 Using a Navigation View Navigation view의 modifier는 {} 안에 배치 Adding Buttons to a Navigation Bar 
SwiftUI - NavigationBar Background 조절하기.
Navigation 을 사용하다보면 네비게이션바 백그라운드 컬러에 대한 이슈를 한번쯤 만나게된다. 디자이너가 원하는 색상, 투명도 제거 같은걸 통상적으로 하게되는데 Swift 에서도 생각보다 까다로운 면이 많았다. SwiftUI 에서는 뭔가 편한 방법이 있을까? 하고 찾아봤더니 역시나... UIKit 의 UINavigationBar.appearance() 옵션으로 적용해보기 이런식으로 View 의 init 에서 UIKit 의 UINavigationBar.appearance() 를 수정하는 방법이 많이 퍼져있었다. 이 코드를 적용하면 원하는데로 네비게이션 바의 백그라운드를 설정할 수 있지만... 2번째 화면까지도 같은 색상옵션이 적용된다. 문제는 뭘까? Navigation 이란 결

SwiftUI - NavigationView, NavigationLink
화면 이동을 위해 사용하는 네비게이션. 기본 구성 자체는 심플하다. 화면에 표기할 컨텐츠를 NavigationView 로 래핑할것. 다음 뷰로 이동이 필요할땐 NavigationLink 를 사용할것. NavigationView 아이템은 스크롤 동작을 보기위해 적당히 만들어서 넣어줬다. 이렇게하면 상단에 요상한 영역이 잡힌체 스크롤되는 뷰를 가진 테스트뷰가 완성. 네비게이션뷰의 디스플레이 설정은 3가지. inline lage automatic 설정시 주의할것은 .navigationTitle("title")
Navigation 속성들
속성들 모아보기 navigationViewStyle .stack NavigationLink의 destination의 뷰가 이전 View를 덮는 방식, 한번에 한 화면만 보여줍니다. .column 아이패드 같이 넓은 화면에서 사이드 메뉴처럼 보여주는 UI를 구현할 수 있습니다. (아이폰에서는 🚫 ) navigationBarTitleDisplayMode .inline NavigationBar에 타이틀이 표시됨 .large NavigationBar 아래에 크게 표시됨 
SwiftUI Trouble Shooting #2: Navigation 후 TabBar가 사라지지 않는 현상
📌 상황 SwiftUI 내에서 화면간의 이동은 NavigationView와 NavigationLink를 통해서 이루어진다. 화면, 즉 각각의 View를 push / pop 하는 방식으로 화면이 구성되는 것이다. 한편 하단 바는 가장 널리 알려진, 그리고 널리 쓰이는 어플리케이션 플로우 구성 방식이며 SwiftUI 내에서 TabView를 통해 구현된다. NavigationView와 TabView를 통해 어플리케이션의 틀을 짜던 중에, NavigationLink를 통해 넘어간 다음 화면에 하단 바가 사라지지 않고 계속 남아 있는 현상을 발견했다. 💻 해결 과정 생각보다 많은 시간을 쏟았지만, Hierarchy를 이해하고 나니 해결 과정은 생각보다 더 간단했다. 원래 코드는 이런 식으로 짜여져 있었다. 지금의 계층 구조는 아래와 같이 되어 있는 것이다.  아이폰 설정메뉴 Navigation Stack Navigation View controller에서 각 메뉴화면이 스택처럼 쌓인 형태로 계층구조를 표현하는 것으로, 하위 메뉴로 들어갈 수록, 스택 안으로 각 메뉴화면은 순차 push되어 쌓이는 것임 -> back 버튼을 누르면 해당 메뉴화면은 pop되는 것임