[SwiftUI] LinkNavigator (2) - Creating TabBar, Custom NavigationBar 저번 포스팅에 이어서 LinkNavigator를 적용해 개발하며 삽질한 예시를 직접 보여드리려고 하는데요, 탭바와 네비게이션바에 대한 이슈가 조금 있어서 이를 해결해보았습니다. TabBar 구현하기 탭바를 SwiftUI에서 만들어서 root뷰로 올릴지, 오픈소스이므로 패키지를 다운받아서 builder를 통해 탭바를 생성하는 방식으로 커스텀할지 고민이 되었습니다. 결국 둘 다 시도해본 결과, SwiftUI에서 만드는 편이 간편하기도하고 커스텀하기 용이하다는 생각이 들어 이 방식으로 결정하였습니다. 1. TabBar가 들어갈 RootView를 구성해줍니다. 이제 home이나 특정 뷰로 l..
SwiftUI로 개발을 하면서 화면 전환에 대한 불편함을 종종 느끼게 되었는데, 이를 해결할 수 있는 좋은 오픈소스 라이브러리가 있어서 소개해보고자 합니다! 바로 ⭐️LinkNavigator⭐️입니다. 이 라이브러리는 웹에서 URI path를 쓰는 것처럼 path를 이용해 화면전환을 할 수 있게 도와주는데요, 기본적인 push · pop 전환과 stack관리 · 딥링크 기능까지 있습니다. 플리토라는 한국 회사에서 개발한 라이브러리이고 한국어 문서도 잘되어 있어요! 이 라이브러리를 직접 소개하시는 영상이 있는데 참고해보셔도 좋을 것 같습니다! GitHub - interactord/LinkNavigator: 🌊 Easy & Powerful navigation library in SwiftUI 🌊 Easy &..
NavigationStack은 path라는 State 변수에 데이터를 push 함으로써 화면전환을 하는데요, 이때 .navigationDestination이라는 메서드에서 push할 뷰의 정보를 받습니다. 그런데 여러 종류의 View를 push하려면 어떻게 해야할까요? 같은 뷰, 다른 데이터라면? - Struct 같은 뷰에 각각 다른 데이터를 넣어야한다면 struct를 사용할 수 있습니다. 공식 예제에서 나오는 방법이죠! struct ViewContent: Hashable { let number: Int let content: String } 이때 Hashable 프로토콜을 준수해야하더라구요. 이 경우에는 String이라는 프리미티브 타입이 있어서 따로 구현하지 않아도 됐는데요, 만약 다른 struct ..
프로젝트 도중에 Combine을 이용하던 중 Subject를 써야할 일이 있었는데, Published는 프로퍼티 래퍼로 감싸져 있는데 Subject는 그냥 써야해서 좀 아쉽더라구요. typealias 이용하고 있다가 이번에 바꿔보기로 했습니다. 프로퍼티 래퍼(Property Wrapper)란? 우선 프로퍼티 래퍼는 SwiftUI를 쓰시는 분들이라면 모두 익숙하실 @State, @Binding 등 '@' 표시가 붙은 어노테이션을 말합니다. 이 프로퍼티 래퍼는 어떻게 구현되어 있을까요? 바로 @propertyWrapper를 이용해서 만들어집니다. @State의 정의부를 보면 이렇게 프로퍼티 래퍼를 쓴 struct 형태로 정의되어 있는 것을 보실 수 있습니다. 따라서 @propertyWrapper를 사용한다면..
SwiftUI에서 Data Binding에 쓰이는 어노테이션들을 정리해보았습니다. @State 같은 struct 내에서만 접근 가능 struct ParenttView: View { @State var state: Int = 0 var body: some View { VStack { ChildView(state: $state) } } } @Binding 다른 struct의 State 참조 가능 부모 뷰에 @State 변수를 생성해주고 자식 뷰에는 @Binding 변수를 생성해준 후 자식 뷰 인스턴스의 파라미터로 State 변수를 전달해 주면 됩니다. struct ParenttView: View { @State var state: Int = 0 var body: some View { VStack { Chi..
정의 struct RoundedButton: View{ let color: Color let text: String let fontSize: CGFloat let icon: String? let action: () -> Void init(color: Color, text: String, fontSize: CGFloat, icon: String?, action: @escaping () -> Void){ self.color = color self.text = text self.fontSize = fontSize self.icon = icon ?? nil self.action = action } var body: some View { Button(action: { action() }){ if let icon ..
- Total
- Today
- Yesterday
- combine
- DocC
- Flux
- Bloking/Non-bloking
- MVC
- Architecture Pattern
- Flutter
- 노션
- RX
- 프로그래머스
- GetX
- 코디네이터 패턴
- notion
- 소프트웨어마에스트로
- programmers
- MVI
- TestCode
- design pattern
- MVVM
- 리액티브 프로그래밍
- coordinator pattern
- Swift Concurrency
- reactive programming
- SwiftUI
- SWM
- 아키텍쳐 패턴
- swift
- healthkit
- 비동기/동기
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |