본문 바로가기
728x90
SMALL

IOS10

커스텀 캘린더 만들기: 전체 설계부터 구현까지 🗓️ 앱에서 자주 마주치는 캘린더 UI. 직접 만들려면 막막하게 느껴질 수 있습니다. 하지만 MVVM 패턴과 컴포넌트 분리 전략을 활용하면 복잡한 캘린더도 체계적으로 구현할 수 있습니다. 오늘은 실제로 동작하는 커스텀 캘린더를 어떤 논리와 순서로 만드는지 상세히 알려드릴게요. 1단계: 프로젝트 설계 및 청사진 그리기 가장 먼저 머릿속으로 캘린더의 구조를 그립니다. 어떤 기능을 담을지, 어떤 파일로 역할을 나눌지 정하는 과정입니다.기능 정의:날짜 표시: 월/일을 표시하고, 주말은 색상을 다르게 표시합니다.데이터 표시: 각 날짜에 수입/지출 금액을 표시합니다.월 이동: 좌우 스와이프를 통해 이전/다음 월로 이동합니다.무한 스크롤: 캘린더가 끝없이 이어지는 것처럼 보이게 합니다.날짜 선택: 특정 날짜를 탭하면 선택.. 2025. 8. 29.
Swift UIKit에서 겪었던 무한 캘린더 스크롤 버그와 해결 과정 🗓️ 안녕하세요! 오늘은 Swift와 UIKit을 이용해 무한 캘린더를 구현하면서 겪었던 흥미로운 버그와 그 해결 과정을 공유하려 합니다. 캘린더 앱을 만드는데, 월별로 끊김 없이 스크롤되는 무한 캘린더 기능을 구현해야 했어요. 그런데 개발 과정에서 예상치 못한 문제가 발생했죠.🔍 문제점: 무한 스크롤이 끊기는 현상 초기 구현에서는 캘린더를 좌우로 스크롤하면 다음 달, 혹은 이전 달이 부드럽게 나타났습니다. 하지만 한 달을 넘어가서 다시 이전 달로 돌아올 때, 캘린더의 일별 데이터가 사라지거나, 월 순서가 뒤죽박죽이 되는 문제가 발생했어요. 헤더의 월과 수입/지출 정보는 올바르게 업데이트되었지만, 캘린더의 날짜 칸이 텅 비어버리는 현상이었죠. 이 현상의 핵심 원인은 CalendarViewModel에서 월.. 2025. 8. 28.
📱 iOS 언어 현지화(Localization) 기본 구현 방법 iOS 앱을 개발하다 보면, 사용자 기기의 언어 설정에 따라 텍스트를 자동으로 변경해야 할 때가 있습니다.예를 들어, 한국어 환경에서는 "오늘", 그 외 언어 환경에서는 "Today"로 보이도록 하고 싶다면 현지화(Localization) 기능을 사용하면 됩니다.1️⃣ Localizable.strings 파일 생성Xcode → File → New → File…Strings File 선택 → 파일 이름을 Localizable.strings 로 입력저장 후, File Inspector에서 Localize… 버튼 클릭지원할 언어(예: English, Korean) 추가2️⃣ 언어별 파일 내용 작성⚠️ 문자열 키("today")는 동일해야 하고, 값만 언어별로 다르게 작성합니다.3️⃣ 코드에서 사용하기let t.. 2025. 8. 11.
🇰🇷 한국에서는 한국어, 그 외 국가에서는 영어로 앱 이름 설정하기iOS 앱 현지화: InfoPlist.strings 활용법 앱을 현지화(Localization)하는 과정에서 종종 다음과 같은 요구사항이 생깁니다.“한국에서는 앱 이름을 한국어로,다른 국가에서는 영어로 표시하고 싶다.” 저 역시 이런 요구사항을 해결하기 위해 iOS의 InfoPlist.strings 현지화 기능을 활용하였습니다.이번 글에서는 그 구현 과정을 간단히 소개드리고자 합니다.🎯 목표 정리지역 또는 국가 앱 이름 표시 언어🇰🇷 한국 (한국어 사용 시)한국어🌍 기타 국가 및 지역영어 1. InfoPlist.strings 파일 생성하기Xcode에서 아래 순서로 파일을 추가합니다.File > New > File > Strings File파일 이름: InfoPlist.strings해당 파일은 앱 이름, 권한 안내 문구 등 Info.plist에 정의된 항목.. 2025. 8. 7.
💰 Swift reduce 완전 정복: totalAmount() 메서드로 배우는 누적 합계 계산 앞서 살펴본 filteredTransactions 함수는 특정 타입과 날짜에 해당하는 거래 내역만 골라내는 데 사용되었습니다.이번에는 그 필터링된 거래들을 합산해서 누적 금액을 계산하는 totalAmount() 메서드를 소개하려고 합니다.📦 함수 선언func totalAmount( type: TransactionType, in date: Date, granularity: Calendar.Component = .month) -> Int { let filtered = filteredTransactions(type: type, in: date, granularity: granularity) return filtered.reduce(0) { $0 + $1.amount }}🧭 이 함.. 2025. 8. 3.
💡 Swift에서 배열 필터링하기: filteredTransactions 메서드 완전 해부 가계부 앱을 개발하면서 특정 조건에 맞는 거래 내역을 추려야 할 때가 많습니다.예를 들어, 이번 달에 발생한 지출만 보고 싶다거나, 7월 한 달 동안의 수입을 계산하고 싶다는 식이죠.이를 위해 만든 함수가 바로 아래의 filteredTransactions입니다.🧩 함수 선언func filteredTransactions( type: TransactionType? = nil, in date: Date, granularity: Calendar.Component = .month) -> [ExpenseModel] { let calendar = Calendar.current let filtered = transactions.filter { transaction in .. 2025. 8. 3.
🧾 iOS MVVM 가계부 앱 - 거래 내역 조회(Read), 수정(Update), 삭제(Delete) 기능 완벽 구현 이전 글에서는 MVVM 구조에서의 TransactionViewModel 전반 구조와 초기화 방식에 대해 정리했습니다.이번 글에서는 그 ViewModel 내부에서 수행되는 데이터 읽기, 수정, 삭제 기능을 소개합니다.✳️ 전체 흐름 요약모든 데이터 처리는 TransactionCoreDataManager를 통해 Core Data와 통신하며, Combine을 통해 비동기 스트림을 처리합니다. 📌 관련 구조:TransactionViewModel → View에서 호출TransactionCoreDataManager → Core Data와 실제 상호작용@Published → UI 바인딩을 위한 데이터 상태 반영📖 Read - 거래 내역 불러오기✅ 모든 거래 내역 불러오기 (readAllTransactions()).. 2025. 8. 3.
💸 iOS MVVM 가계부 앱 - ViewModel(TransactionViewModel) 구조 완벽 정리 가계부 앱을 MVVM 구조로 개발하면서 핵심 역할을 하는 TransactionViewModel에 대해 소개합니다.이 글에서는 ViewModel의 역할, 내부 구조, init 설계 이유, 그리고 View와의 데이터 흐름까지 모두 짚어볼게요.🎯 ViewModel이란?MVVM에서 ViewModel은 View와 Model 사이의 중간 매개체로 작동합니다.사용자의 입력을 받아 Model에 반영하고, Model의 데이터를 가공해 View에 제공합니다.💡 이 글에서는 실제 프로젝트에 사용한 TransactionViewModel을 기준으로 설명합니다.📦 전체 구조 살펴보기final class TransactionViewModel { // MARK: - Published Properties @Pu.. 2025. 8. 3.
📦 iOS MVVM 가계부 앱 - Core Data 삭제(Delete) + 이미지 제거까지 정리 가계부 앱에서 한 번 입력한 지출/수입 데이터를 삭제하는 기능은 반드시 필요합니다. 특히 사용자가 실수로 입력했거나, 잘못된 이미지를 포함한 경우 Core Data + 이미지 파일까지 함께 삭제하는 구조가 되어야 합니다. 이번 글에서는 deleteTransaction(id:) 함수를 중심으로 Core Data에서의 삭제 처리 흐름과 이미지 정리 방식까지 상세히 정리합니다.🧩 1. 삭제 함수 코드func deleteTransaction(id: UUID) -> AnyPublisher { return Future { [weak self] promise in guard let self = self else { print("❌ deleteTransaction: self가 n.. 2025. 8. 2.
📚 iOS MVVM 가계부 앱 - Core Data 수정(Update) + 이미지까지 깔끔히 반영하는 법 가계부 앱을 만들면서 생기는 대표적인 고민 중 하나는 "기존에 등록된 내역을 수정할 때 이미지나 메모를 어떻게 반영하지?" 입니다.이번 글에서는 Core Data에서 기존 내역을 업데이트하고, 선택적으로 이미지까지 덮어쓸 수 있는 구조를 소개합니다.💡 목표 기능사용자가 등록한 기존 내역(지출/수입)을 수정메모, 금액, 카테고리 등 변경 사항 반영기존 이미지가 있을 경우:이미지 삭제이미지 교체기존에 이미지가 없더라도 새로 추가 가능📦 업데이트 함수 코드func updateTransaction(_ updatedTransaction: ExpenseModel) -> AnyPublisher { return Future { [weak self] promise in guard let self =.. 2025. 8. 2.
728x90
LIST