iOS 타이머 앱 개선사항 정리
1. UI/UX 개선
1.1 레이블 입력 UI 개선
- 기존: 단순 TextField로 구현
- 개선:
- 레이블 컨테이너 뷰 추가 (
labelContainerView
)
- 좌측에 "레이블" 텍스트 라벨 추가 (
labelTextLabel
)
- 우측에 이름 입력 필드 배치 (
nameTextField
)
- 전체적인 디자인 통일성 향상
1.2 타이머 종료 옵션 추가
- 새로운 "타이머 종료 시" 버튼 추가 (
timerEndButton
)
- 사용자가 타이머 종료 시 동작을 설정할 수 있는 UI 요소 추가
- 좌측 정렬과 적절한 패딩으로 가독성 향상
1.3 테이블뷰 기능 강화
- 스와이프 삭제 기능 추가
canEditRowAt
및 trailingSwipeActionsConfiguration
메서드 구현
- 직관적인 삭제 UX 제공
2. 데이터 관리 개선
2.1 타이머 삭제 기능 강화
- CoreData와 로컬 데이터의 동기화 로직 개선
func deleteTimer(at index: Int) {
guard index < timerItems.count else { return }
let timers = coreDataManager.fetchTimers()
guard index < timers.count else { return }
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.coreDataManager.deleteTimer(timers[index])
self.timerItems.remove(at: index)
}
}
- 메인 스레드에서 안전하게 삭제 작업 수행
- 데이터 정합성 보장을 위한 인덱스 검증 강화
2.2 CoreData 저장 로직 개선
TimerCoreDataManager
의 deleteTimer
메서드 개선
func deleteTimer(_ timer: TimerItem) {
context.delete(timer)
try? context.save()
}
- 삭제 후 즉시 저장을 시도하여 데이터 일관성 유지
3. 코드 품질 개선
3.1 UI 컴포넌트 초기화 로직 분리
setupComponents
메서드 내부 구조화
- 각 UI 요소별 설정을 명확하게 구분
- 코드 가독성과 유지보수성 향상
3.2 Auto Layout 개선
- SnapKit을 사용한 제약조건 설정 개선
- 동적 크기 조정을 위한 제약조건 추가
- 레이아웃 코드의 구조화 및 가독성 향상
4. 추가된 기능
4.1 타이머 선택 시 동작 개선
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let timer = viewModel.timerItems[indexPath.row]
viewModel.setTimer(hours: timer.hours,
minutes: timer.minutes,
seconds: timer.seconds)
nameTextField.text = timer.name
tableView.deselectRow(at: indexPath, animated: true)
}
4.2 시간 감소 버튼 추가
- 시, 분, 초 각각에 대한 감소 버튼 추가
- 순환식 감소 로직 구현 (0에서 감소 시 최대값으로 변경)
func decrementHours() {
hours = hours > 0 ? hours - 1 : 23
}
func decrementMinutes() {
minutes = minutes > 0 ? minutes - 1 : 59
}
func decrementSeconds() {
seconds = seconds > 0 ? seconds - 1 : 59
}