일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ReferceCycle
- Input Output
- 면접을 위한 CS 전공 지식 노트 Tree
- Carousel CollectionView
- Reference Cycle
- @escaping
- til
- Array vs Linked List
- UserDefaults
- UIKit
- wil
- 프로그래머스
- tableview section별 다른 cell적용
- coremotion
- 롤케이크 자르기
- NavigationSearchBar
- 면접을 위한 CS전공 지식 노트
- 테이블뷰 나누기
- CoreData
- retain cycle
- 강한 참조 순환
- TableView Section
- TableView
- 자료구조
- class struct
- firebase
- CarouselCollectionview
- 양궁대회
- Value Type Reference Type
- SWIFT
- Today
- Total
목록UIKit (26)
개발하는 동글 :]

1. 문제 상황 더보기 위의 이미지처럼 다양한 다양한 화면에서 비슷한 화면이 자주 사용된다. 그렇기에 반복되는 작업을 줄이고자 하였다. 2. 시도한 방법 2.1 LockScreenView 구현 더보기 // // LockScreenView.swift // FinalTodo // // Created by SeoJunYoung on 10/23/23. // import UIKit class LockScreenView: UIView { let titleLabel: UILabel = { let label = UILabel() label.font = .preferredFont(forTextStyle: .title1) return label }() lazy var passwordCollectionView: UIColl..

1. 앱 잠금기능을 어떻게 구현할까? 앱 잠금기능을 db에 연동하여 사용할까라는 고민을 해보았다. 그래서 비밀번호를 찾는 기능까지 구현을 할까라는 생각을 하였다. 그렇게 참고할 앱들을 찾아보며 팀원들과 회의를 하던 중 팀원분이 다른 앱의 화면잠금 기능을 편리하게 구성하는 방법을 제시해 주셨다. 바로 아래와 같이 앱의 잠금을 암호를 분실했을 경우 앱을 삭제하고 재설치하는 방법이다. 이러한 방법으로 구현을 어떻게 할까 생각해 보았는데 그냥 유저의 비밀번호를 userDefault에 저장하여 관리하면 될 것 같다는 생각이 든다. 2. 이런 방식으로? 그럼 다음으로 어떠한 시점에 앱의 잠금 화면을 보여줘야 할까에 대한 고민이다. 보편적인 상황을 생각해 본다면 앱을 시작하는 순간, 다른 앱을 사용 하다가 다시 앱으..

1. 왜 dismiss후 present 가 필요 할까? 지금 구현한 LockScreen ViewController는 비밀번호가 일치 할 때 TargetViewController를 띄워주는 기능을 하고 있다. 이렇게 작동하게 될 때 NavigationController에 쌓이는 컨트롤러는 아래와 같다 여기서 문제가 발생하였다. LockScreen ViewController는 메모리에 올라와있어 불필요한 메모리와 이 후 뷰에서 접근이 가능한 상태가 되는 문제가 발생한다 그렇기에 비밀번호가 일치해서 다음 화면으로 넘어갈 때 LockScreenViewController를 dismiss한 후 targetViewController를 present하는 방법이 필요하다. 2. 어떠한 방법으로 해결할 수 있을까? 2.1..
1. 오늘의 회고 오늘 팀회의로 이슈 관리를 어떻게 할 것인가, 코드리뷰를 어떠한 방식으로 진행할 것인가,에 대한 방안을 회의하였다. 다양한 의견들이 있었고 나의 의견은 이슈관리는 깃허브의 이슈를 사용하는 것과 코드리뷰는 단순히 매일 밤 회의에서 화면 공유를 하는 방식으로 하자고 제안하였다. 그 후 회의의 결과로는 이슈관리는 깃허브 이슈관리를 사용, 코드리뷰는 매일 5시까지 pr을 올린 후 회의시간 전까지 각자 질문 및 코드를 설명하는 것으로 결정하였다. 이 회의를 통해 느끼게 된 것은 어떻게 협업을 할 것인가를 이유 없이 선정하게 된다면 팀원 모두가 힘든 시간을 가지게 된다. 만약 코드리뷰를 매일 밤 회의에서 진행하였다면 회의가 길어지고 팀원들 모두가 지치고 부담을 가지고 작업을 할 것 같다. 이렇듯 ..

1. FireBase 연결하기 1.1 Firebase 프로젝트 생성하기 1.2 iOS 버튼을 눌러서 App 등록하기 1.3 app등록하기 1.4 SPM에서 FireBase 패키지 추가 1.5 GoogleService - Info 파일 추가 1.6 초기화 코드 추가 import UIKit import FirebaseCore @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.c..
1. Custom Delegate 구현하기 memoView.contentTextView.delegate = self memoView.optionCollectionView.delegate = self memoView.optionCollectionView.dataSource = self 평소 커스텀 뷰를 사용하며 커스텀 뷰에 포함된 collectionView 및 textView 등 다양한 컴포넌트의 delegate들을 이런 식으로 사용해 왔다. 그러다 문득 이러한 델리게이트를 통합하면 어떨까?라는 생각을 하여 구현을 시도해 보았다. 먼저 memoview에서 사용 될 collectionview만 하나로 만드는 작업으로 실험을 해 보았다. collection의 delegate와 datasoure에서 사용하는 메..
1. Coredata VS UserDefaults 1.1 Coredata CoreData는 "데이터베이스"가 아니라 이를 지원하는 "프레임워크"라는 것이 특징입니다. 대규모 데이터를 저장하거나 체계적인 데이터베이스가 필요할 때 사용하는 것이 적절합니다. 링크드 리스트처럼 객체를 탐색하다 보니 탐색 성능은 비교적 나쁘고, Thread-Safe 하지 않아 Lock으로 동기화 처리를 해줘야 합니다. 대신, 원하는 데이터가 메모리에 올릴 수 있기 때문에 대규모 데이터를 저장해도 메모리 효율이 떨어지지 않습니다. 종합하면 대규모 데이터를 저장해야하는 상황에서 영속성 기능을 포함한 CoreData의 다른 기능도 필요하다면 CoreData를 선택하는 것이 적절해 보입니다. 1.2 UserDefaults UserDef..
1. Observables 패턴 사용해 보기! MVVM패턴을 사용하기 위해서 Observable 패턴 사용을 연습해 보았다 2. Observable 클래스를 생성 class Observable { var value: T { didSet { listener?(value) } } private var listener: ((T) -> Void)? init(_ value: T) { self.value = value } func bind(_ closure: @escaping (T) -> Void) { closure(value) listener = closure } } Observable 타입을 이용하여 bind 및 value값을 사용가능한 상태로 만들어준다. 3. Observable Type을 채택한다. fina..

1. 문제 상황 Observable class Observable { var value: T { didSet { listener?(value) } } private var listener: ((T) -> Void)? init(_ value: T) { self.value = value } func bind(_ closure: @escaping (T) -> Void) { closure(value) listener = closure } } ViewModel final class FTOPViewModel { var rangeBTtitle: Observable = Observable("단어장 선택") var vocaList: Observable = Observable([]) } bind viewModel.voca..

1. Try func textFieldDidChangeSelection(_ textField: UITextField) { var text = textField.text ?? "" let width = textField.frame.width if width > (Constant.screenWidth - (Constant.defalutPadding * 2)) { text.popLast() diaryAddView.titleTextField.text = text } } 처음 생각해 본 접근으로는 textfield의 넓이를 주지 않은 다음 textfield의 넓이가 글자수에 따라 넓어질 때 그 넓이가 일정한 넓이보다 커질 경우 마지막 글자를 제거한 뒤 텍스트 필드에 재할당 하는 방식이다. 결과는? 위의 동영상과 ..

1. 팀 프로젝트의 시작 1.1 팀 프로젝트에서의 역할 위의 이미지의 화면을 담당하기로 하였고 첫 화면은 Carousel CollectionView 를 적용하고 두번 째 modal 페이지는 다양한 animation을 적용해볼 예정이다 1.2 Carousel CollectionView의 적용 전에 연습해 보았던 Carousel CollectionView 를 적용한 모습 1.3 전체 코드 // // FeatureViewController.swift // oewoboka // // Created by 김도현 on 2023/09/25. // import Foundation import UIKit import SnapKit final class FeatureViewController: UIViewControlle..

1. MVVM 양식에 맞게 코드를 적어보자! 아직은 아키텍처 패턴은 잘 모르겠지만 MVVM에 맞게 한 번 코드를 짜보자! 그럼 MVVM은 뭘까? MVVM 패턴을 사용하는 경우 앱은 다음 계층으로 나뉩니다. 모델 계층은 비즈니스 데이터를 나타내는 형식을 정의합니다. 여기에는 코어 앱 도메인을 모델링하는 데 필요한 모든 항목이 포함되며, 종종 코어 앱 논리가 포함됩니다. 이 계층은 뷰 및 뷰 모델 계층과는 완전히 별개이며, 클라우드에 부분적으로 상주하는 경우가 많습니다. 뷰 계층은 UI를 정의합니다. 태그에는 특정 UI 구성 요소와 다양한 뷰 모델 및 모델 멤버 간의 연결을 정의하는 데이터 바인딩이 포함되어 있습니다. 경우에 따라 코드 숨김 파일은 UI를 사용자 지정하거나 조작하는 데 필요한 추가 코드를 포..
1. CoreData의 사용을 위한 CoreDataManager 구현 CoreData사용을 위해 CoreDataManager를 만들어 보는 것을 시도해 보자! CoreDataManager를 사용하기 위해 class를 만들고 싱글톤 패턴으로 만든 뒤 기본적인 프로퍼티를 만들어 보자. final class CoreDataManager{ static let shared = CoreDataManager() private init() {} private let appDelegate = UIApplication.shared.delegate as? AppDelegate private lazy var context = appDelegate?.persistentContainer.viewContext private let..

1. 목표? 일단 구현한 후 코드를 이해하는 것을 목표로 CoreData를 사용해보자. 2. 구현 2.1 CoreData의 Model 만들기 먼저 새롭게 CoreData의 Data Model 파일을 만들어준 뒤 Entities를 새롭게 하나 만들어서 원하는 속성들을 만들어준다. 2.2 AppDelegate파일 수정 //AppDelegate // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "MyToDoApp_3") container.loadPersistentStores(completionHandler: { (storeDescrip..

1. 왜 UIButton을 커스텀하게 되었는가? 위의 이미지처럼 버튼을 3번 사용하게 되는데 중복되는 코드들을 줄일 수 없을까?라는 고민에서 시작하게 되었다. 그 고민의 결과로 UIButton을 커스텀해보자는 생각을 하게 되었다. 2. 사용 전과 후 비교 func setUpCheckListButton(){ view.addSubview(checkListButton) checkListButton.setTitle("title", for: .normal) // 중복 checkListButton.setTitleColor(.link, for: .normal) // 중복 checkListButton.snp.makeConstraints { make in make.centerX.equalTo(view.snp.center..

1. 구현 영상 2. 구현 1. 사용할 이미지 배열, imageView, collectionView 생성 var imageDatas = [ UIImage(named: "image1"), UIImage(named: "image2"), UIImage(named: "image3"), UIImage(named: "image4"), UIImage(named: "image5"), UIImage(named: "image6"), UIImage(named: "image7") ] var imageView = UIImageView() let myCollectionView: UICollectionView = { let flowLayout = UICollectionViewFlowLayout() let collectionView..

1. ScrollView 만들기 private let contentScrollView = UIScrollView() 1. 먼저 ScrollView 컴포넌트를 생성해 준다. private func setUpContentScrollView(){ view.addSubview(contentScrollView) contentScrollView.snp.makeConstraints{ make in make.edges.equalTo(view.safeAreaLayoutGuide) } } 2. 뷰에 addSubView를 해준 다음 스크롤 뷰의 상, 하, 좌, 우 제약을 잡아준다. 2. ContentView 만들기 private let contentView = UIView() 1. ContentView를 UIView로 생성..

Why? memo app을 따라 만들어 보며 메모를 삭제하였을 때 하단의 메모 개수가 변경되지 않는 문제가 발생한 적이 있다 이러한 문제를 해결하는 과정으로는 해당 뷰의 viewWillAppear 메서드에 tableview와 collectionview, toolbar를 업데이트 및 다시 할당을 하니 문제를 해결 할 수 있었다. 그렇기에 viewWillAppear 메서드는 무엇이며 UIViewController에 어떠한 메서드와 프로퍼티가 있는지 확인해 봐야겠다는 생각이 들었다. override func viewWillAppear(_ animated: Bool) { // 화면이 새롭게 그려질 때마다 호출됨 myTableView.reloadData() myCollectionView.reloadData() s..

Why? 메모 앱의 기능중 갤러리로 보기를 구현하기 위해 CollectionView가 필요하여 구현하게 됨 TIL 문제 상황: 버튼을 누를시 리스트 형식의 뷰에서 갤러리 형식으로 바꿔서 보여줘야함 -> 데이터의 isTable 프로퍼티에 따라 tableview와 collectionview의 히든 값을 조정하여 구현 dataManager.isTable ? tableViewOn() : collectionViewOn() 동일한 위치에 tableview와 collectionview를 둠으로써 hidden값을 이용해 화면 구성이 가능해짐 CollectionView 코드 extension Page2ViewController: UICollectionViewDataSource, UICollectionViewDelega..

이번 주 목표 내일 배움 캠프 커리큘럼을 따라가며 커리큘럼의 내용 잘 흡수하기 아이폰 Setting App UI에 디테일 한 부분 및 약간의 기능추가 해보기, [0730] 프로토콜, [0730] 계산 속성, [0730] 접근 제어, [0730] 동기 비동기, [0730] 다음 주 목표 프로토콜, [0730] 계산 속성, [0730] 접근 제어, [0730] 동기 비동기, [0730] 내용 1. 내일 배움 캠프 커리큘럼을 따라가며 커리큘럼의 내용 잘 흡수하기 나와 스터디원들은 이번 주의 과제를 좀 더 높은 목표로 구현하는 것을 목표로 하였다. 그렇기에 시작된 기본 메모앱을 따라 만들어 보며 CRUD 및 화면 전환을 익힐 수 있었다. 생각했던 것보다 어렵고 시간이 많이 걸렸지만 메모앱을 따라 만들어보며 접하..