๐ŸŽ Dev/SwiftUI

[SwiftUI] Navigation 1

Callie_ 2024. 9. 24. 13:48

 

 

 

์ฐธ์—ฌ์ค‘์ธ ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์—์„  UIKit๊ณผ SwiftUI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํƒญ๋ฐ” ๋“ฑ ํ™”๋ฉด์ „ํ™˜์€ UIKit์„ ์‚ฌ์šฉ ์ค‘์ด์–ด์„œ ์‚ฌ์‹ค SwiftUI์˜ Navigation ๊ธฐ๋Šฅ์„ ์ œ๋Œ€๋กœ ์จ๋ณธ ์ ์ด ์—†์—ˆ๋‹ค. ๋Œ€์‹  ํ‹ˆ๋‚˜๋Š”๋Œ€๋กœ ์ง๊ด€๋กœ๊ทธ๋ฅผ SwiftUI๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•˜๊ณ  ์žˆ์–ด์„œ  ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ํ™”๋ฉด์ „ํ™˜ ๊ด€๋ จ ๋กœ์ง์„ ์† ๋Œ€๊ธฐ ์ „ ์‚ฌ์ „ ๊ณต๋ถ€๋ฅผ ํ• ๊ฒธ Navigation์„ ์กฐ๊ธˆ ๋œฏ์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

 

 

์ฐธ๊ณ ๋กœ, ์ด ๊ธ€์—์„œ ๋‹ค๋ฃฐ Navigation์€ iOS 16 ์ด์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.

 

iOS 16 ์ด์ „์—” NavigationView๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜, iOS 16์—์„  ํ•ด๋‹น API๊ฐ€ deprecated๊ฐ€ ๋˜์—ˆ๋‹ค. ํ•ด๋‹น๊ธ€์—์„  iOS 16 ์ด์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— NavigationView์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š์„ ์˜ˆ์ •์ด๋‹ค.

 

 

 

 

 

iOS 16 ์ด์ „๊ณผ ์ดํ›„์˜ ํ˜•์‹ ๋ณ€ํ™” from ์• ํ”Œ๊ณต์‹๋ฌธ์„œ

 

 

 

 

ํ˜„์žฌ 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

 

https://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-types#Update-single-column-navigation

 

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

 

https://medium.com/@hagjini0/swiftui-navigationlink-navigationstack-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-8a22eaddfddc

 

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