One week with SwiftUI

I just wrapped up a week of working with SwiftUI full time. It certainly has some rough edges and each new beta version brings a lot of changes. Here is a recap of what’s working for me and what I still need to figure out.

List views are really simple in SwiftUI. The first layout that loads in my app is a List view has two main sections. The first section has a few rows for some saved queries that I’ll implement later, the second section is dynamic data from Core Data. Xcode Beta 5 introduced some new property wrappers and environment variables for working with Core Data. You can read more about these additions here.

Data entry: I made some simple forms with a few fields and a custom control for picking colors. The only problem I’m having with data entry is actually with the modal presentation implementation of SwiftUI. I call the sheet modifier and pass it a view, but this has some issues with not loading data on repeated calls. I’m calling this modal sheet from the main list view for adding new records, and from a detail view for editing existing records. I have an issue where I can’t get the list view to update when I modify a record that is a few views away (List > Detail > Edit). I think this has something do do with the way that I’m loading the list with Core Data records, as there is nothing that is triggering a refresh when I save the modified record. I need to figure out a better way to setup a publisher with Core Data. A possible workaround for this is to implement record editing on the list rows, just like when a user swipes a table row to disclose an edit button. I just can’t seem to figure out how to do that yet. I may use the new ContextMenu instead if I can’t figure it out soon.

Button("Add List") {
    self.editModal = true
}
.padding(EdgeInsets(top: 0, leading: 0, bottom: 10, trailing: 20))
.accentColor(Color(Theme.shared.appMainTint))
                          
.sheet(isPresented: $editModal,
       onDismiss: {
        self.timelineEditModal = false
},
       content: {
        ListEditView()
            .environment(\.managedObjectContext, self.managedObjectContext)
})

Color Picker: The list based item in my app is composed of of a name, color, and icon. I wanted to try to mimic the new color picker in the new version of the Reminders app. While SwiftUI doesn’t have an alternative to the Collection View yet, I was able to get my color picker working by dynamically calculating a number of columns. I used Geometry Reader to get the width of the parent view, then just divided it by the size (including padding) that I wanted each color to take up. I passed that number to a child view that parses out a list of colors into rows and columns. I got the idea for the grid here. I’m planning on implementing something similar with the icon, using a subset of SF Symbols.

Dynamically sized color picker on iPad and iPhone.

I spent a large part of today refactoring a lot of my code into smaller views that are easier to reason about. Xcode can have a hard time handling complex views with lots of embedded views, so it can be helpful to break them into small components where possible.

Some issues I haven’t figured out:

  1. Master Detail by default – On iPad I get free Master Detail by default, but I’m not certain this is right for my app. I have not found a way to just fill the screen with my list view. There is also an annoying issue that iOS loads an empty detail view when in portrait mode. I can’t believe this is still the default behavior after years of iOS but it is… 
  2. Modal views seem to break when loaded from a List item. They will work correctly the first time, but when opened two or more times they do not load the data that is being passed to them. I was able to confirm that the data is being passed, but SwiftUI is not using it to update the views.
  3. iOS 13 has a new (old) style for rounding the corners of grouped tables/lists. I can’t find a way to do this yet. .listStyle(GroupedListStyle()) does not do the trick.
  4. List Edit Mode – I can toggle edit mode on, but have yet to figure out what to do next. I want to let users reorder rows, and I want to show an info button that will open a modal sheet for modifying a record.

SwiftUI is still new and can be frustrating at times but I think I can safely say that I’m going to make the production version of my app with it. In one week of work I caught up to the UIKit version of my app, which took nearly two months. Granted, a lot of that time was focused on planning and design, which benefited both versions. I think I’ll stick with SwiftUI just so I never have to deal with Auto Layout ever again.

Thinking about SwiftUI

Last week I decided to spend the weekend learning about SwiftUI. The weekend turned into an entire week but I was eventually able to learn everything I set out to learn. This course on Udemy was particularly helpful.

I’m going to take a long weekend to give myself time to reflect on what I have learned so far. One thing I want to think about is if I should use SwiftUI for my app. The app I’m working on is simple enough and SwiftUI can do almost everything I need. There are a few areas where I may have to drop out to UIKit but for the most part I think I can make it work. Importantly, I think I may be able to make a better user experience with SwiftUI than I can with UIKit. So many things in UIKit require more code and complexity and if I stay on that route it may be several months before my app meets the expectations that I have for it.

I guess I have a lot to think about this weekend.

Questions for myself about SwiftUI

This weekend I’m going to spend some time with SwiftUI. I tried to think of the most important questions that I want to answer. I have no idea how much progress I will make but if I come up with answers to these I’ll write about them.

  1. Can I connect a SwiftUI List to a Core Data FetchedResultsController?
    1. How do I set this up?
    2. Load data
    3. Edit data
    4. Delete data
  2. Does SwiftUI support advanced table features?
    1. Readable Size for cells
    2. Reorder controls
    3. Context actions
  3. How can I pass an object from a list view to a form view?
    1. Dependency injection?
  4. Can I make form views that do not save data until the done button is tapped? Pass back to the List view to save the changes. 
  5. Can I easily segue to UIKIT View Controllers? I need access to CollectionViews and Large TextViews, neither of which exist in SwiftUI.

Symbols and icons

I’m working on an icon picker for my app. The idea is to allow users to select a color and icon as a secondary way of identifying their lists. I have 10 colors picked out and the color picker is up and running, and I just wrapped up the first pass at the icon picker. For the time being I’m using SF Symbols. I went through the list of available symbols and found 101 that I think may be useful for my app. I may switch to a third-party icon pack before launch, but once I ship version 1.0 I need to make sure that I’m providing access to a consistent set of icons.

Light Mode version

Dark Mode version

Finding the right work

When I started Radical Application Development in 2015 one of my core goals for the business was to get into app development. At that time I had built a number of business systems and databases and I was eager to make a consumer product. I didn’t have time to pursue this goal full time but throughout 2016 I learned a lot about Swift and iOS development.

Time and again I ran into issues with the apps I wanted to make. Most of my ideas seemed like they would be achievable but ended up being far beyond my skills. I vastly underestimated how complex iOS development was. Each time I ran up against what I could do I gave up instead of pressing on. For example, I built a really awesome time tracking app using Core Data but when I tried to sync the data between devices I had nothing but issues. I lacked the skills and confidence to write my own syncing engine so I put the project on hold and never picked it back up.

Toward the end of 2016 my friend (and later podcast co-host) suggested that I check out SpriteKit. I had never even considered making a game, but I worked through some tutorials and decided to give it a shot. I spent most of November that year building a small game called Random Arrow. I released the app into the iOS app store in December 2016.

While Random Arrow never took off I gained something valuable from it. Working in SpriteKit and Swift on a simple game gave me the confidence I needed. Despite having no idea how game engines worked, and little “real” programming experience I was able to produce and ship something. Looking back at Random Arrow now I think it’s sort of a silly idea, but I’m still glad I made it. The confidence I gained from that project lead me to expand my consulting services beyond FileMaker. I starting making web applications in PHP–which has paid the bills ever sense–and I started learning Unity and Unreal Engine.

In early 2017 Dave and I decided to attend a local game development meetup. I wanted to share Random Arrow and was eager to meet some “real” game developers. While we were at the meetup Dave tried the Oculus Rift. He was pretty impressed by it and so was I. I didn’t actually try it at the meeting as I kind of nervous that I would look silly. I purchased a VR headset and a PC to use it with and turned my focus to VR development. I’m not going to go into details here but I spent the next two years with my attention focused on VR. You can get most of the story from VR Hermits.

As with the early iOS projects I got in way over my head with VR development. While I learned a ton about Unity, C#, 3D modeling, animation, and AI, I never shipped a consumer product. I kept my business running during this while with consulting work, mostly FileMaker or PHP projects, but I spent almost all of my time and energy on VR. At one point I was working so much that I actually did a lot of damage to my hands and wrists–damage which I’m still dealing with.

In spring of 2019 I finally decided to step away from VR development, at least where games are concerned. I know enough about game development now to know that I’ll never make a great game. I’m more than capable of using the tools and doing the development, but I lack the type of vision and creativity needed to make a great game. If I really wanted to I could make some bad games, but I’m not interested in doing that.

I’ve spent my time since then working on FileMaker, WordPress, and PHP consulting projects. I also started working on a new iOS app–something that will be the focus of this blog over the next few months. After nearly two years of trying to get good at something I’ll never be good at, I rediscovered that I am good at some things. I have a lot of skill when it comes to problem solving, user interface design, data modeling, and I’m going to spend my time and attention on those skills from now on.

I may revisit VR development someday, but not as a game developer. I’d love to create some productive applications in VR and AR, possibly even expanding on the projects I’m building now. Now that this little side quest into VR is over I’m making real progress on iOS development. Some of the concepts that baffled me in 2016 are easy to grasp now. There are also a lot of new APIs and advancements in iOS and Swift. I could even pick up my time tracking app again, as Apple had made new APIs for working with Core Data and CloudKit. For the first time in years I feel like I’m on the right track.

New Podcast: Project Update

In spring of 2018 Dave and I put VR Hermits on hiatus. Dave had some interesting work he wanted to focus on and I needed to spend some time on a few consulting projects. We had planned to resume in the fall but I think somewhere along the line Dave realized that Virtual Reality development was not what he wanted to do. It took me a lot longer to come to the same conclusion. Despite this, I kept pestering Dave to start recording again. I really missed the weekly calls where I could bounce my ideas off of him and hear about what he was working on.

A couple of months ago we finally decided to get pack to podcasting. We initially had no idea what the show would be about and even considered a return to Massively Unqualified Development. Regardless, we started recording some beta episodes in May of 2019 and we eventually settled on a new format. Those beta episodes may never be published, but the result is out new podcast called Project Update.

Joe and Dave discuss the progress of their respective projects, delving into the challenges, successes, and failures of being commercial software developers, periodic game developers, and general technology enthusiasts. Project Update is about our projects and lives, but we’ll also be bringing in other creators to talk about their projects and lives. In some ways we’re all dealing with the same issues, and in others we’re dealing with a problem space uniquely our own.

About the show, Project Update

In this new podcast we talk each week about our software development projects–among other things. Dave is building developer tools for the FileMaker community and I’m creating an iOS app in addition to my FileMaker and Web consulting work. As of the time of this post we have recorded four episodes, including an episode with our first guest.

Updating my website

Sometime last year allowed myself to get away from working on this site. I was never “complete” to begin with, but it got to the point where the content on this site was no longer relevant to the work I do. Today I decided to spend some time trying to clean things up.

I started with some new branding colors, the most important of which is HEX #5D28A7. I’m using that color heavily in an iOS app I’m working on and I plan to incorporate it into some additional products down the line. My site is powered by WordPress so the next step was to select a theme. I recently worked with Ascend on a consulting project and was impressed how customizable it was without having to dive into to the code. I installed the premium version and got to work. After selecting a layout, changing some colors, making a menu, and adjusting some settings I managed to make something that I like. I have a lot of work to do on it but I’m happy with the progress so far.

Something I had a lot of trouble with was writing a short blurb or description about myself or my business… I think for now I’ll let the site speak for itself. Perhaps I’ll add something later. I used to stress out about this sort of thing but I’ve been in business for four years now and I have never had a customer mention my website to me. It seems like all of my consulting business has been based on referrals from other customers.

Someday I’d like to get a logo made for the business and the website. I have no idea what that would look like or what I would want it to say about me.

Project Phidias Day Two – 5/17/2018

Today I wrapped up my initial development cycle for Project Phidias. I added a list/check list system that uses project templates to create lists for tasks.

I’m sure I’ll make lots of small changes in the coming weeks but for now I have enough done on this system that I can get back to creating 3D models.

1 2 3 4