[SwiftUI] Navigation 1
์ฐธ์ฌ์ค์ธ ํ์ฌ ํ๋ก์ ํธ์์ UIKit๊ณผ SwiftUI ํ๋ ์์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ณ ์๋๋ฐ, ํญ๋ฐ ๋ฑ ํ๋ฉด์ ํ์ UIKit์ ์ฌ์ฉ ์ค์ด์ด์ ์ฌ์ค SwiftUI์ Navigation ๊ธฐ๋ฅ์ ์ ๋๋ก ์จ๋ณธ ์ ์ด ์์๋ค. ๋์ ํ๋๋๋๋ก ์ง๊ด๋ก๊ทธ๋ฅผ SwiftUI๋ก ๋ฆฌํฉํ ๋ง ํ๊ณ ์์ด์ ๊ฒธ์ฌ๊ฒธ์ฌ ํ๋ฉด์ ํ ๊ด๋ จ ๋ก์ง์ ์ ๋๊ธฐ ์ ์ฌ์ ๊ณต๋ถ๋ฅผ ํ ๊ฒธ Navigation์ ์กฐ๊ธ ๋ฏ์ด๋ณด๊ธฐ๋ก ํ๋ค.
์ฐธ๊ณ ๋ก, ์ด ๊ธ์์ ๋ค๋ฃฐ Navigation์ iOS 16 ์ด์์ ๊ธฐ์ค์ผ๋ก ์์ฑํ๋ค.
iOS 16 ์ด์ ์ NavigationView๋ฅผ ์ฌ์ฉํ์์ผ๋, iOS 16์์ ํด๋น API๊ฐ deprecated๊ฐ ๋์๋ค. ํด๋น๊ธ์์ iOS 16 ์ด์์ ๊ธฐ์ค์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ NavigationView์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ์ง ์์ ์์ ์ด๋ค.
ํ์ฌ SwiftUI ๋ด์์ ๋ค๋น๊ฒ์ด์ ์ผ๋ก ํ๋ฉด์ ํ์ ํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
1. NavigationStack + NavigationLink
2. NavigationStack + NavigationDestination
3. NavigationStack + NavigationLink + NavigationDestination
4. NavigationStack + NavigationPath + NavigationDestination
์ ์
NavigationStack, NavigationLink, NavigationDestination
NavigationStack
: A view that displays a root view and enables you to present additional views over the root view.
์ ํ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, navigationStack์ rootView ๋ฅผ ์์์ผ๋ก ๊ทธ ์๋ก view๋ฅผ ์์ ์ ์๊ฒ ํ๋ ๋ทฐ๋ผ๊ณ ์ค๋ช ํ๊ณ ์๋ค. ์ด๋ฆ์ ๋ค์ด๊ฐ "Stack"์ฒ๋ผ, ๊ทธ๋ฅ ๋ง๊ทธ๋๋ก rootview๋ฅผ ๋งจ ๋ฐ์ ๋๊ณ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ฐจ๋ก๋ก ๋ทฐ๊ฐ ์์ธ๋ค.
NavigationLink
: A view that controls a navigation presentation.
๋ค๋น๊ฒ์ด์ ๋งํฌ๋ ๋ค๋น๊ฒ์ด์ ์ ํ์ ๊ด๋ฆฌํ๋ ๋ทฐ.
NavigationDestination
: Associates a destination view with a presented data type for use within a navigation stack.
๋ค๋น๊ฒ์ด์ ๋ฐ์คํฐ๋ค์ด์ ์ ๋ค๋น๊ฒ์ด์ ์คํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค๋น๊ฒ์ด์ ์คํ์ ์ ์๋ ๋ฐ์ดํฐ์ ๋งค์นํด์ฃผ๋ ์ญํ ์ ํ๋ค.
**์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ ์ ํ๋๋ ๋ทฐ์ ํ์ ์ด ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ปํ๋ค.
NavigationStack๊ณผ NavigationLink
NavigationStack์ RootView๋ฅผ ๋งจ ๋ฐ์ ๋ ๋ทฐ ์คํ์ ๊ด๋ฆฌํ๊ณ , NavigationLink๋ ๊ทธ ๋ทฐ ์คํ์ ๋ทฐ๋ฅผ ์ถ๊ฐํ๋ ์ญํ ์ ์ํํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ NavigationStack๊ณผ NavigationLink๋ ์ธํธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด NavigationStack ์์ NavigationLink๋ฅผ ๊ตฌํํด์,
1. ๋ทฐ ์คํ์ ๋ง๋ ๋ค (NavigationStack)
2. ๋ทฐ๋ฅผ ์ถ๊ฐํ๋ค. (NavigaitonLink)
์์ ๋ฐฉ์์ ํตํ์ฌ SwiftUI ๋ด์์ ๋ค๋น๊ฒ์ด์ ์ ๊ตฌํํ๋ค.
์ ๊ฐ๋ ์ ํ์ฉํ์ฌ ์์ฃผ basicํ ๋จ๊ณ์ ๋ค๋น๊ฒ์ด์ ํ๋ฉด์ ํ ์์ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด์๋ค.
Example #1
ํ์ฉ api:
- https://developer.apple.com/documentation/swiftui/navigationlink/init(_:destination:)-7d6im
init(_:destination:) | Apple Developer Documentation
Creates a navigation link that presents a destination view, with a text label that the link generates from a localized string key.
developer.apple.com
๊ฐ์ :
- rootview๋ NaviBaseView ์ด๋ฉฐ, ๋ค๋น๊ฒ์ด์ ์คํ๋ทฐ ์์ YellowView์ OrangeView๋ฅผ ๊ฐ๊ฐ ์์์ ๋ค๋น๊ฒ์ด์ ์ผ๋ก ํ๋ฉด ์ ํ์ ๊ตฌํ.
- RootView → ChildView (Push, Pop)
์ฝ๋:
import SwiftUI
struct NaviBaseView: View {
var body: some View {
NavigationStack {
NavigationLink("YellowView") {
NaviYellowView()
}
NavigationLink("OrangeView") {
NaviOrangeView()
}
}
} // body
} // view
- Navigation์ผ๋ก ๋ทฐ ์ ํํ ๋ทฐ๋ค์ NavigationLink๋ฅผ ์จ์ NavigationStack์ ์ถ๊ฐํด์ฃผ์๋ค.
- RootView๋ NaviBaseView์ด๊ธฐ ๋๋ฌธ์, ์๋ฎฌ ์์์์ ํ์ธ ํ ์ ์๋ฏ์ด ํด๋น ๋ทฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ทฐ๊ฐ ์์ฌ์ ์ ํ๋๋ค.
- ํด๋น API ์ NavigationLink(“value“ ) value๊ฐ์ ๋ฒํผ๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
Example #2
ํ์ฉ api:
https://developer.apple.com/documentation/swiftui/view/navigationdestination(for:destination:)
navigationDestination(for:destination:) | Apple Developer Documentation
Associates a destination view with a presented data type for use within a navigation stack.
developer.apple.com
๊ฐ์ :
- NavigationLink์ value๊ฐ์ด ์๋ ์ปค์คํ ๋ฒํผ์ ๋๋ฌ์ childView๋ก ํ๋ฉด ์ ํํ๋๋ก ๊ตฌํ.
์ฝ๋:
import SwiftUI
struct NaviBaseView: View {
// 1. ๋ฒํผ ์ํ๊ฐ
@State private var isButtonTapped: Bool = false
var body: some View {
NavigationStack {
// 2. ๋ฒํผ ์ถ๊ฐ
Button(action: {
isButtonTapped = true
}, label: {
Text("Button")
.frame(width: 100, height: 48)
.background(.green)
})
// 3. ์ํ๊ฐ ๋ฐ์ธ๋ฉ + ์ด๋ํ ๋ทฐ ์ถ๊ฐ
.navigationDestination(isPresented: $isButtonTapped) {
NaviYellowView()
}
}
} // body
} // view
- ๋ฒํผ ์ํ๊ฐ์ ํธ๋ฆฌ๊ฑฐ๋ก ๋ค๋น๊ฒ์ด์ ํ๋ฉด์ ํ์ ํ๋ ๊ธฐ๋ณธ ์ฝ๋
data๋ก ์ ํํ๋ ๊ฒ ์ฌ์ค SwiftUI ํ๋ฉด์ ํ์ ๊ฝ(?)์ด๋ผ data๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋น๊ฒ์ด์ ์ ํ ํ๋ ๋ฒ์ ๋ค์ ํฌ์คํ ์ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
References
Migrating to new navigation types | Apple Developer Documentation
Improve navigation behavior in your app by replacing navigation views with navigation stacks and navigation split views.
developer.apple.com
SwiftUI: NavigationLink, NavigationStack ์์๋ณด๊ธฐ
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ฑ์ ๋๋ถ๋ถ 1๊ฐ ์ด์์ ํ๋ฉด์ ๊ฐ์ง๋ค. ์ด ํ๋ฉด๋ค ์ฌ์ด๋ฅผ ์์ ๋กญ๊ฒ ์ด๋ํ๊ธฐ ์ํด์๋ Tab, modal ๋๋ Navigation ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
medium.com
https://zeddios.tistory.com/1376
[SwiftUI] NavigationView โก๏ธ NavigationStack
์๋ ํ์ธ์ :) Zedd์ ๋๋ค. @available(iOS, introduced: 13.0, deprecated: 100000.0, message: "use NavigationStack or NavigationSplitView instead") public struct NavigationView : View where Content : View { ... } WWDC22์์ NavigationView๊ฐ depreca
zeddios.tistory.com
https://www.celinemoon.com/blog/navigationstack-and-navigationpath/
SwiftUI NavigationStack๊ณผ NavigationPath
SwiftUI์์ NavigationStack ์ฌ์ฉํ๋ ๋ค์ํ ๋ฐฉ๋ฒ
www.celinemoon.com