[개선] SheetVC에서 push하기
·
내일배움캠프/Kickboard - Animality
프로젝트 발표회 이후"Modal로 띄운 뷰에서 또다시 Modal을 띄우는 것은 사용자 경험 측면에서 좋지 않다"라는 피드백을 받았습니다. 지도뷰에서 마커를 선택하면 present로 SheetVC를 띄우는데,시트뷰에서 셀을 선택하면 또다시 present로 PaymentVC를 띄우고 있었습니다. 시트뷰 내부에서는 네비게이션 컨트롤러로 동작하도록 개선하였습니다. extension MapViewController { func showSheet(with: coordinate: Coordinate) { let sheetVM = SheetViewModel(modelManager: viewModel.modelManager, coordinate: coordinate) let sheetVC = P..
[트러블 슈팅] 간헐적으로 바인딩 클로저가 실행되지 않는 현상
·
내일배움캠프/Kickboard - Animality
⚠️ 문제: 간헐적으로 바인딩 클로저가 실행되지 않는 현상간헐적으로 바인딩 동작을 정의해둔 클로저가 실행되지 않는 현상이 나타났습니다.그때문에 의도한 동작이 제대로 실행되지 않았습니다. ❗️원인: 바인딩 클로저의 중복 동작 정의처음에는 노트북이 안좋아서 시뮬레이터가 이상하게 동작한다고 생각했는데 전혀 아니었습니다.. MapVC와 SheetVC는 모두 LocationViewModel이라는 동일한 뷰모델을 사용하고 있었습니다. 그러나 뷰모델의 state가 변화했을 때 두 VC에서 취할 state와 해당 상태에서 실행할 동작은 서로 다르기 때문에각각의 VC에서 자신이 필요한 state에 대해서만 클로저의 동작을 정의해주었습니다. 바로 이때문에 문제가 발생하였습니다. MapVC는 viewDidLoad 시점에 ..
[의사결정 기록] User 모델 저장 방식 논의
·
내일배움캠프/Kickboard - Animality
📝 User 모델 저장 방식 논의🗓️ 2026-03-05 (목)의견1. Coredata에 회원가입 정보를 저장 (회원가입 시마다 데이터 저장)→ 여러 명의 유저 정보 보유→ 운영자 / 유저 권한 구분 가능 2. UserDefaults에 앱을 사용하는 사용자 1명의 회원가입 정보만 저장 (신규 회원가입 시 데이터 덮어쓰기) 결과UserDefaults에 사용자 1명의 정보만 저장 선정 이유1번 방식이 앱 완성도 측면에서는 좋다는 점을 인지하고 있으나 금요일 정오까지의 촉박한 프로젝트 마감기한으로 인한 기능 간소화 결정→ 추후 담당자가 리팩토링을 진행한다면 해당 기능을 구현해보는 것으로 결정
[트러블 슈팅] UICollectionView 상단에 여백 주기
·
내일배움캠프/Kickboard - Animality
⚠️ 문제: UICollectionView 상단에 여백 미존재Sheet VC에 UICollectionView를 배치했는데 top 여백이 없이 배치되었습니다. ❗️ 원인: 잘못된 여백 설정기존에는 아래와 같이 여백을 설정하고 있었습니다.class SheetAnimalCollectionView: UICollectionView { private func setAttributes() { directionalLayoutMargins = NSDirectionalEdgeInsets(top: 40, leading: 20, bottom: 0, trailing: 20) // 여백 설정 } // 컬렉션뷰 레이아웃 설정 private func makeCollectionViewLayout() -> UICollection..
[트러블 슈팅] UICollectionView Cell deque시 NSAttributedString 생성 불가 현상
·
내일배움캠프/Kickboard - Animality
⚠️ 문제: UICollectionView Cell deque시 NSAttributedString 생성 불가 현상네이버 지역 검색 API의 응답값은 검색 결과로 html 형식의 문자열을 보내주고 있습니다.이를 문자열로 바로 사용하기 위하여 NSAttributedString으로 변환하는 메서드를 String 타입에 확장하여 정의하였습니다.extension String { func htmlToString() -> NSAttributedSTring? { guard let data = self.data(using: .utf8) else { return nil } return try? NSAttributedString( data: data, options: ..
[트러블 슈팅] UIButton의 isHighlighted 미해제
·
내일배움캠프/Kickboard - Animality
⚠️ 문제: MapView에 배치한 UIButton의 isHighlighted 상태가 미해제되는 현상 MapView 위에 배치한 UIButton이 클릭 후 isHighlighted 상태가 해제되지 않는 현상이 나타났습니다. ❗️ 위험: 잘못된 addSubview 주체 선정private func setLayout() { mapView.addSubview(currentLocationButton) currentLocationButton.snp.makeConstraints { $0.bottom.trailing.equalTo(view.safeAreaLayoutGuide).inset(10) $0.width.height.equalTo(60) }} currentLocationBu..
[의사결정 기록] API Key 은닉화 방법 선택하기
·
내일배움캠프/Kickboard - Animality
📝 API Key 은닉화 방법 선택🗓️ 2026-02-27(금)의견1. xcconfig를 통해 Key 보관하기 : .xcconfig 파일을 생성하여 Key 저장 후, info.plist에 추가하여 사용하는 방법 : git에 올릴 때는 gitignore로 .xcconfig 파일 제외 2. swift 파일에 상수화하여 직접 보관하기 : swift 파일 내부에 static 전역 변수로 Key를 선언하여 사용하는 방법 : git에 올릴 때 지워서 올려야함 3. 서버에서 API Key 내려받기 : 외부 서버와의 통신을 통해 API Key를 받는 방법 결과프로젝트 내부에 api.json 파일을 추가하여 파싱하여 변수에 저장하여 사용,api.json 파일은 gitignore 하는 방식 채택→ 2번 방식을..
[의사결정 기록] 아키텍처 패턴 선정하기
·
내일배움캠프/Kickboard - Animality
📝 Animality 아키텍처 패턴 선정🗓️ 2026-02-26(목)의견- MVC 패턴- MVVM 패턴 결과MVVM 패턴 채택ModelAPI 응답 모델데이터 모델(동물 정보 / 유저 정보 / 결제 영수증 정보)모델 관리 객체(Coredata Manager / NetworkManager)ViewUI 담당UI - VM 바인딩 담당(ViewController)ViewModel비즈니스 로직 담당UI 사용 데이터 가공바인딩 액션(클로저)을 통한 VM → View 데이터 전달 선정 이유1. Massive VC 문제 해소2. 테스트 용이성 ↑: 각자 다른 부분을 구현하므로 일부가 미구현되었을 경우에 목업 테스트가 용이하다면 구현의 편의성을 높여줄 것이라 기대3. 코드 재사용성, 유지보수성 ↑4. 데이터 흐름이 명..
[프로젝트 소개] 공유 킥보드 앱 만들기 - Animality
·
내일배움캠프/Kickboard - Animality
내일배움캠프 9주차 팀프로젝트로 공유 킥보드 앱을 구현했습니다. GitHub - mastarTrack/team2_AnimalityContribute to mastarTrack/team2_Animality development by creating an account on GitHub.github.com 1. 프로젝트 개요🎯 프로젝트 명 - Animality: Animal + Mobility의 합성어로, '환상의 동물' 대여 서비스를 제공하는 어플리케이션→ 지도에서의 동물 탐색 및 대여 기능, 이용 내역 관리 기능 탑재 → 공동의 재화를 공유하고 빌려쓴다는 점에서 과제 구현의 재미를 더하기 위해 단순한 이동 수단이 아닌 환상의 동물들을 대여할 수 있다는 설정을 추가 → 학습을 위한 프로젝트이므로 공동의..
[의사결정기록] MVC 패턴에서의 amountTextField 동작 정의
·
내일배움캠프/환율 계산기 - 개인 프로젝트
1️⃣ amountTextField의 동작 할당class CalculationViewController { private var stringAmount: String? private func setTextFieldAction() { let save = UIAction { [weak self] _ in let text = self?.calculationView.passAmountText() self?.stringAmount = text } calculationView.setTextFieldAction(save) }}CalculationView의 amountTextField의 경우, 텍스트필드의 텍스트..