원래 무한스크롤이라고 하면 맨 아래까지 스크롤하는 것을 트리거로 새로운 컨텐츠를 계속 로드해 화면에 붙여주는 형태를 말하는데요,저는 이와 다르게 위의 끝까지 스크롤했을 때 위로 컨텐츠가 붙는 기능이 필요했습니다.. (이전 채팅 보기 기능)이를 구현하기 위해 시도했던 다양한 방법들을 공유해보려고 합니다!ios v16에 맞춰 17부터 사용 가능한 API들은 사용하지 않았습니다. 1. refreshable + 컨텐츠를 배열에 insert하기먼저 떠올린 방법은 refresable을 이용하고 로드한 컨텐츠를 기존 배열 맨 앞에 insert해서 붙여주는 것입니다.struct ChatScrollTest: View { struct Message: Hashable { let id: UUID = .in..
[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 ..
분리를 결심한 계기 현재 프로젝트에서 ViewModel은 Container View(페이지 단위)와 1:1로 사용하고 있었습니다. 그런데 한 컨테이너뷰에 기능이 많아질 때, 뷰는 컴포넌트를 분리해가며 크기를 유지시킬 수 있었는데, 뷰모델은 계속해서 커지는 문제가 발생했습니다. 현재 Combine을 이용해서 작업하고 있는데 뷰모델이 관리하는 상태가 너무 많아져 어떤 변수가 어디에 쓰이는지 구분하기가 헷갈려졌고, 바인드 코드 또한 관리하기가 어려워졌습니다. 이에 여러 방법을 생각해보다 뷰모델을 분리하기로 결심했습니다. 문제의 뷰모델 import Foundation import Combine class SignupViewModel: ObservableObject { // MARK: - Dependency le..
프로젝트 도중에 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
- design pattern
- TestCode
- combine
- Swift Concurrency
- DocC
- MVC
- reactive programming
- MVVM
- SwiftUI
- SWM
- healthkit
- coordinator pattern
- ios
- 아키텍쳐 패턴
- 소프트웨어마에스트로
- MVI
- 노션
- programmers
- Bloking/Non-bloking
- 리액티브 프로그래밍
- notion
- Flutter
- RX
- 비동기/동기
- 프로그래머스
- swift
- GetX
- 코디네이터 패턴
- Architecture Pattern
- Flux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |