일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Human interface guide
- Clean Code
- MVVM
- map
- UICollectionView
- collectionview
- 애니메이션
- swift documentation
- Observable
- rxswift
- ribs
- combine
- swiftUI
- Refactoring
- HIG
- RxCocoa
- ios
- UITextView
- uitableview
- uiscrollview
- SWIFT
- Xcode
- 스위프트
- 리펙터링
- 리펙토링
- Protocol
- clean architecture
- 클린 코드
- 리팩토링
- tableView
- Today
- Total
목록swiftUI (116)
김종권의 iOS 앱 개발 알아가기
1. Pagination 방법 (페이지네이션, Combine) - 기초 2. Pagination 방법 (페이지네이션, Combine) - 메인 스레드 최적화, 이미지 캐싱 Pagination 개념 List에서 스크롤할 때 필요한 데이터를 계속 추가적으로 받아오는 형태 대용량의 데이터를 한꺼번에 받아오면 부하가 크므로, 10개를 보여주고 그다음 스크롤이 마지막에 도달할때 그 다음 10개를 보여주는 형식 API를 호출할땐 page Int 값을 다르게 보내면서 데이터를 가져오는 방법 SwiftUI 에서의 Pagination 구현 아이디어 List의 마지막 부분에 로딩뷰를 따로 추가하고, 그 부분이 onAppear 될때 페이지네이션 수행 List { ForEach(items) { item in } if !ite..
MVVM 핵심은 View와 ViewModel이고 각 역할을 기억 View: ViewModel에서 상태가 변하면 그 상태를 단순히 구독하고 있다가 View를 변경하는 역할 ViewModel: 상태 값을 저장하고 있고, 상태 값을 관리(계산 등)를 하는 역할 View와 ViewModel 구현 핵심 View에서 특정 UI의 action이 발생하면 ViewModel에 던져줌 ViewModel에서는 액션에 따라 특정 상태값을 관리하고 상태값을 변경 ViewModel의 상태값을 바라보고 있는 View는 그에 맞추어서 UI 변경 주의사항) 상태 관리 포인트는 View가 아니라 ViewModel이므로, 상태 관련 코드는 ViewModel 한 곳에서 수행되도록 할 것 View, ViewModel 구현 아이디어 enum을..
가장 일반적인 List 형태 List 하위에 NavigationLink가 있는 형태 import SwiftUI struct ContentView: View { var items = (0...100).map(String.init).map(SomeModel.init) var body: some View { NavigationView { List(items){ item in NavigationLink( destination: { Text(item.val) }, label: { Text(item.val) } ) } .navigationTitle("List 예제") } } } struct SomeModel: Identifiable { let val: String var id: String { val } } 오른쪽..
SwiftUI에서 Info.plist SwiftUI로 프로젝트를 생성하면 Info.plist가 없는 상태 프로젝트를 만들면 Info.plist 파일은 생성되지만, 위 파일에 노출되지않고 만약 info.plist 내용이 변경되면 노출 Info.plist파일을 Xcode의 Navigator에서 수정하지 말고 Target에 들어가서 수정할것 여기서 + 버튼을 클릭하여 새로운 key-value 추가 ex) 사진 저장을 위해 권한 요청하기 위해 NSPhotoLibraryAddUsageDescription 키값을 추가하여 사용 요약 SwiftUI 프로젝트에서는 Xcode 왼쪽에 위치한 Navigator에 Info.plist 파일이 보이지 않으므로, Target > Info 에서 설정해서 사용할것 * 참고 https..
네비게이션 바 검색 창 검색 창 구현 방법 List에 띄울 뷰와 데이터 모델 준비 struct SomeView: View { var name: String var body: some View { Text(name) } } struct SomeData: Identifiable { var name: String var id: String { self.name } } ContentView에 필요한 프로퍼티 준비 searchQueryString: 검색창에서 값을 입력할 때 입력될 프로퍼티 datas: 리스트에 표출할 데이터 filteredDatas: 검색 결과 필터링된 데이터 * 대소문자 상관 없이 검색하기 위해서 string.contains()가 아닌, string.localizedStandardContai..
UIVeiwControllerRepresentable UIKit의 ViewController 타입을 SwiftUI의 View 타입으로 변경하여 사용할 수 있는 기능 UIViewControllerRepresentable 프로토콜을 준수하는 구조체를 만들어서 사용 // UIViewControllerRepresentable 프로토콜 public protocol UIViewControllerRepresentable : View where Self.Body == Never { associatedtype UIViewControllerType : UIViewController func makeUIViewController(context: Self.Context) -> Self.UIViewControllerType f..
목차) Combine - 목차 링크 Map 값 요소들을 하나씩 맵핑 (값에 변화를 주는 연산자) let publisher1 = [1, 2, 3].publisher let cancellable1 = publisher1 .map { $0 + 2 } .sink(receiveValue: { print($0) }) /* 3 4 5 */ tryMap map 클로저 내부에서 예외가 던져질 수 있는 연산이 있을때 사용 예외 처리하는 곳은 sink의 receiveCompletion에서 수행 enum SomeError: Error { case zero } let publisher2 = [2, 1, 0].publisher let cancellable2 = publisher2 .tryMap { guard $0 != 0 els..
목차) Combine - 목차 링크 Scheduler 언제, 어떻게 클로저가 실행될지 정하는 프로토콜 thread 설정도 가능 (main, global) 시간 설정도 가능 Scheduler 사용 방법 스레드 변경 receive(on:): downstream의 스레드 변경 subscribe(on:): upstream의 스레드 변경 receive(on:), subscribe(on:) 안쓴 경우 스레드 확인 DispatchQueue.global()로 실행한 경우, main thread가 아닌 global thread에서 sink의 클로저 부분이 동작 즉, 따로 스케줄러 설정을 하지 않으면 subject의 이벤트를 발행하는 쪽의 스케줄러와 동일하기 sink 클로저 부분이 동작 let subject = Pass..