For this project, I built the UI using Storyboard. I was eager to get the core functionality working, so my initial design was pretty rough. In hindsight, I would have spent more time upfront refining the UI, going back later to fix Auto Layout and constraints ended up being more tedious than I expected. At the time, though, my main goal was to fetch the rover image and get it to display on screen.
To handle communication between view controllers, I used the delegate-protocol pattern. This allowed the selected rover and date from the UI to be passed back to the RoverManager, which was responsible for constructing the appropriate API request. Network logic—including URL creation and URLSession tasks—was abstracted into separate files to maintain clear separation of concerns. I made a conscious effort to keep the main view controller lightweight, focusing solely on UI-related tasks. This architecture not only improves readability and maintainability, but also lays a solid foundation for future unit testing.
I followed the MVC architecture pattern for this project. Most of the view was built using Storyboard, with a few UI tweaks handled in a configureUI function that I called in viewDidLoad. Throughout the build, I was intentional about moving any non-essential logic out of the ViewController. For example, I had a bit of code to clean up the selected date (removing the time portion), which started in the ViewController but eventually got its own utility file. Similarly, any UI adjustments that could be handled at build time were extracted into their own files for better separation of concerns.
Once I had the core functionality in place, I shared the app with a few close friends. One of them offered to collaborate on the design, and that’s when the visual side of Rover Photo really came to life. Even though this was a side project, the new design assets completely transformed the look and feel of the app. Collaborating with others is one of my favorite parts of development. I love bringing people into what I’m building and seeing where their creativity takes it.
I recently completed several enhancements to improve the app’s functionality and user experience. A loading animation now appears while the rover image is being fetched, providing helpful feedback during network requests. The date picker has been refined to only allow dates after the selected rover's landing, preventing invalid selections. I also resolved various minor UI issues to create a more polished interface.