Some reasons SwiftUI might not be right for you

As work slows down for the holidays, I have found myself with some spare time. I decided to sit down and tinker with SwiftUI to see what it could do. While I was impressed with how easy it was to get pixels on-screen, test them and get data flowing, there are still several issues. I am going to document them here.

This should have been simple, a navigation bar with a left button, a right button, a text-based title, and a tint color applied. Looking at the documentation it would appear .accentColor() is what I wanted. I applied it and found that while it does apply the tint color to bar items, it does not apply it to the title text.

There is a terrible workaround where you can set the leading items as an Hstack, Add a title view, then set the width to match the screen, but I really do not recommend doing this.

for the record, I also tried setting .foregroundColor() to the same effect.

Filed a Radar.

Scroll View Paging (Missing Feature)

If you want a scroll view to snap to pages (useful for snapping to cards or other content) in UIKit it was as easy as setting .isPagingEnabled = true on a UIScrollView. This feature seems to have been omitted from SwiftUI.

Filed a Radar.

Take the following example using Xcode Version 11.3 (11C29), This is currently the latest build.

struct Detail: View {
    var body: some View {
        Text("Detail")
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: Detail(), label:{ Text("Hello") })
                NavigationLink(destination: Detail(), label:{ Text("Hello 2") })
            }
            .navigationBarTitle("Testing")
        }
    }
}

If you were to launch this and tap the first link, tap back, then tap the first link again, it will not load.

Tapping the second link, in this case, will load.

Filed a Radar.

Most Autocompletes Do Not Work As Expected (Editor Issue)

Buttons are the obvious offender.

Button(action: {

}, label: { () -> PrimitiveButtonStyleConfiguration.Label in

})

Most of the time, what you are looking for is

Button(action: {
    print("Hello")
}) {
    Text("Hello")
}

I am still not sure what PrimitiveButtonStyleConfiguration.Label means.

No Good CollectionView Equivalent (Missing Feature)

While you can create some decent views that look like CollectionView by nesting scroll views, there is no method of doing this where the data is dynamically loaded.

The only component in SwiftUI that appears to use dynamic loading is List. ScrollView will require all items to be loaded into memory before it can render.

All of this to say, if you need a horizontal scroll view to load in many items, SwiftUI will cause you some serious performance issues.

I am not sure if this is intentional or not. It is possible that Apple doesn’t want heavy usage of horizontal scroll views.

I will be watching this going into June.

Conclusion

SwiftUI is really fun and the data flow is just awesome. It makes building new screens super quick and opens the door to a ton of prototyping.

I am sure these will all be fixed in time, but many of these are deal-breakers and as it is right now, I will not recommend SwiftUI for any paid projects I am involved with.

This article will be updated as I find more issues.


SwiftUI Tutorial Series

Paul Hudson of Hacking With Swift has been kicking ass since June digging in to the very depths of SwiftUI. Along with his book, he has also been churning out and an ever growing series of videos.

Hacking with iOS: SwiftUI Edition

This series starts from the basics and moves into helping you understand a lot of how the framework works under the hood.

If you have any intention of learning SwiftUI, I highly recommend watching.


Scroll to top in iOS 13 UI Testing

In XCTestCase if you want to scroll to the top of a scrollable view, you tap on the status bar

XCUIApplication().statusBars.firstMatch.tap()

However, this is doesn’t work in iOS 13.

I filed a radar during the beta and they just got back to me with this.

The status bar is no longer part of the application, it’s part of the system UI (“springboard”). Change your test as follows:

let systemApp = XCUIApplication(bundleIdentifier: "com.apple.springboard")
systemApp.statusBars.firstMatch.tap()

This seems like it should be important, but it was not documented anywhere on Apple’s website.

If still need to support Xcode 10 / iOS 12, I recommend using the following extension

extension XCUIElement {
    func scrollToTop() {
        if #available(iOS 13, *) {
            let systemApp = XCUIApplication(bundleIdentifier: "com.apple.springboard")
            systemApp.statusBars.firstMatch.tap()
        } else {
            XCUIApplication().statusBars.firstMatch.tap()
        }
    }
}

I figured I would share this so that it is at least documented somewhere.


Tips for Great Conference Calls

Working in software development, is it guaranteed that you will attend a conference call at some point. I hate to use the cliché, but it’s 2019 and some people are still terrible at this. You will hear noises in the background, people won’t pay attention or will talk over each other and you have technical blunders.

So I decided to put together a list of tips for improving your conference call experience.

Find a good meeting space

This one sounds obvious, but try to make every effort to obtain a quiet space to have your meeting. Conference rooms are the best choice, but barring that, any quiet space will do.

Also be aware that while it may be quiet for you, you will be potentially making the space less quiet for other people. Avoid taking calls at your desk if you are in an open office.

If it is nice outside and you are the only caller from your end, it can sometimes be nice to go for a walk. I have taken calls on city walking trails and parking garages before. This might not be ideal for every call, but it’s a good option to have.

Join on time

When you schedule a meeting, you are making a promise to your attendees, you are taking up peoples time. if you fail to join people who could otherwise be doing useful work are instead waiting in dead silence for the call to begin.

Don’t be late.

If you absolutely must be late, make sure you send out a notification as early as possible to let them know of your delay or, even better, update the calendar invite with a new start time.

Sound

If you are taking the call alone, use headphones with a microphone. These typically sound better because the microphone is close to your mouth, but be mindful you don’t move around much if it is laying against your shirt. Avoid Bluetooth headphones unless you know they are of a high quality so you don’t sound robotic.

Mute yourself when you are not speaking. Learn how to mute your call in the software you use and make liberal use of that button.

If you are taking a call with multiple people, avoid using Laptop microphones. Also, be aware they can pick up the sound of every keystroke if you are typing while talking. We have a couple Jabra Speak 510’s in our office, and they work great.

Make sure you silence your phone and laptop.

I like to do a quick audio and camera check before I join a call, most conferencing software will have a screen for this in their settings. Check your Mic and Camera to make sure the correct devices are selected.

Pay Attention

If you aren’t presenting or on camera, it can be easy to pull out your phone and browse Reddit or stare blankly out a window, but try to pay attention having to ask “wait, what did you say again” can be embarrassing.

Put your devices in Do Not Disturb mode so you don’t get sidetracked by text messages or other notifications. iOS has a great feature where your phone will remain silenced until the end of your current calendar item.

For meeting hosts, try to stay on topic and keep people involved in the conversation, this will prevent wandering minds.

If you find a meeting has become sidetracked and the main topic is complete, please don’t hesitate to let people uninvolved in the side topic know they are free drop off.

Keep your desktop clean

If you are going to be sharing your screen, make sure your desktop is not cluttered. Take special care to remove documents with confidential or private information. Remove that funny meme your friend sent you. Just make sure your desktop has nothing that will embarrass you or your company. To make it easier, you can just make a folder called “clutter” and move everything in there.

I’ve already mentioned Do Not Disturb mode several times in this post, but if you are screen sharing and you get an inappropriate text message from a friend, you will regret not silencing your notifications.

Do a camera check before joining video calls

Before you join the meeting fire up your camera and take a look at your background.

Check for clutter. Dirty laundry, trash, alcohol bottles… I have seen all of this, and it’s just unprofessional.

Make sure you don’t have proprietary information up on a whiteboard. If you do client work, this is especially important as it can have legal ramifications.

Check yourself. Look in the mirror, make sure you are as presentable as you would be in person.

Open Questions

Try to avoid asking undirected questions, try to keep them directed at individuals. Asking questions like these will cause one of three things to happen.

  1. Multiple people answer at the same time and they talk over each other
  2. No one talks and you get dead air and have to direct your question at a specific person anyways.
  3. What you want to happen, happens and the correct person and only that person answers.

You get a 1/3 chance for it to work, It’s awkward and you should just avoid it if possible.

If you are running a standup meeting, you get to pick who talks first, don’t open it up to the floor.

In Summary

  • Find a quiet place that won’t bother other people.
  • Be punctual or notify everyone you will be late as soon as possible.
  • Take measures to prevent interrupting sounds.
  • Pay attention so people don’t have to repeat themselves.
  • Check your desktop before enabling screen sharing.
  • Check your environment before joining a video call.
  • Avoid undirected questions.

I hope you found this useful and if you didn’t, great job, you were probably already doing the right thing.

Please share this and perhaps we can make conference calling better for everyone.