A task management tool designed to help users create, manage, and track their reminders efficiently. Built using Swift and UIKit, this application provides a clean and intuitive interface for users to interact with their reminders.
The Reminder application enables users to create, track, and manage reminders for specific dates and times. It uses MVVM to separate business logic (ViewModel) from the UI (View), and leverages UserDefaults for data persistence.
-
User-Friendly Interface
A clean and intuitive UI that allows users to easily navigate through their reminders. -
Date Selection
The app provides a date picker and a custom horizontal date selector usingUICollectionView
, enabling precise date selection. -
Dynamic Updates
The application updates the reminder list dynamically as reminders are added or modified. -
Dynamic Text Support
The text fields and labels handle multiline and extended text gracefully. -
UserDefaults Storage
Reminders persist locally on the device throughUserDefaults
(managed byStorageManager
). -
Native Date Picker Components
Utilizes Apple’sUIDatePicker
for a consistent iOS look and feel. -
Light/Dark Mode Support
Uses system colors (.label
,.secondaryLabel
, etc.) to support dynamic appearance across both light and dark modes.
The application adopts a Model-View-ViewModel (MVVM) architecture:
-
Model
Represents the data structure of the reminders. TheReminder
struct encapsulates properties such as title, date, and completion status. -
View
- Built programmatically using UIKit.
- Includes
HomeViewController
(main screen with reminders list),CreateViewController
(reminder creation screen), and custom UI components likeHomeTopView
.
-
ViewModel
HomeViewModel
andCreateViewModel
contain the core logic:- Filtering, toggling completion status, sorting reminders (
HomeViewModel
). - Managing new reminder creation (
CreateViewModel
).
- Filtering, toggling completion status, sorting reminders (
- Serves as the bridge between the Model and View, ensuring the View remains lightweight.
This project uses multiple patterns to pass data and events between components:
-
Protocols & Delegates
CreateViewModelOutputProtocol
and other protocol definitions allow the ViewModel to communicate changes back to the View.UITextViewDelegate
,UIPopoverPresentationControllerDelegate
, and similar UIKit delegates handle UI events.
-
Closures
- In
DatePickerManager
, closures capture user-selected date/time and pass it back to the presenting controller.
- In
-
Observers (NotificationCenter)
- When a new reminder is created, a
.didCreateNewReminder
notification is posted. HomeViewController
listens for this notification to refresh the list dynamically.
- When a new reminder is created, a
-
Dependency Injection
- The
SceneDelegate
injectsHomeViewModel
intoHomeViewController
. - The
CreateViewController
is initialized with aCreateViewModel
to ensure the ViewModel is available from creation time.
- The
-
Swift
The primary language for iOS development in this project. -
UIKit
For building the user interface programmatically (no Storyboards). -
UserDefaults
Used to persist and retrieve reminders through a dedicatedStorageManager
. -
UIDatePicker
Provides native date and time picking functionality. -
UICollectionView & UITableView
UICollectionView
for the horizontal date selector at the top of the home screen.UITableView
for listing reminders (with custom cells).
-
Clone the repository
git clone https://github.com/yourusername/reminder-example-app.git
This command will download all the project files to your local machine.
-
Navigate into the Project Folder
cd reminder-example-app/Reminder
Change your current directory to the folder that contains the Xcode project.
-
Open the Project in Xcode
open Reminder.xcodeproj
Launch the Xcode project by opening the .xcodeproj file
-
Build and Run
- Select a simulator or a connected iOS device from the Scheme menu in the Xcode toolbar.
- Click the Run (▶) button to build the project and launch the app.
-
Home Screen
- At the top, you’ll find a horizontal date selector implemented via a collection view.
- Below the selector, a list of reminders is displayed for the currently focused date.
-
Adding a Reminder
- Tap the plus (+) icon on the home screen to open
CreateViewController
. - Enter your reminder’s title, select the desired date/time, and tap Save.
- The new reminder instantly appears on the home screen for the selected date.
- Tap the plus (+) icon on the home screen to open
-
Viewing & Managing Reminders
- The
HomeViewController
dynamically filters and shows only the reminders belonging to the selected date. - Tap any reminder in the list to toggle its completion status (marked as complete or incomplete).
- The
-
Changing Dates
- Swipe or tap through the horizontal date selector to quickly view different dates.
- Alternatively, tap the calendar icon (in
HomeTopView
) to use a date picker popover for more precise selection.
Image 1 | Image 2 | Image 3 |
---|---|---|
![]() |
![]() |
![]() |
Empty Home (Dark Mode) | Home (Dark Mode) | Add Reminder (Dark Mode) |
Image 4 | Image 5 | Image 6 |
---|---|---|
![]() |
![]() |
![]() |
Empty Home (Light Mode) | Home (Light Mode) | Add Reminder (Light Mode) |
Image 7 | Image 8 | Image 9 |
---|---|---|
![]() |
![]() |
![]() |
Date Picker Home (Dark Mode) | Date Picker Add Reminder Day (Dark Mode) | Date Picker Add Reminder Hour (Dark Mode) |
Image 10 | Image 11 | Image 12 |
---|---|---|
![]() |
![]() |
![]() |
Date Picker Home (Light Mode) | Date Picker Add Reminder Day (Light Mode) | Date Picker Add Reminder Hour (Light Mode) |