Bite-sized videos on iOS development.
The iOS landscape is large and changes often. With short, bite-sized videos released on a steady schedule, NSScreencast helps keep you continually up to date.
Up to date with Xcode 15 and iOS 17
UIKit, SwiftUI, SwiftData, and macOS
Swift Language
High Quality Videos
Short and Focused
Any Device
Team Plans
Have I mentioned lately how awesome NSScreencast is? No? Worth the subscription. Check it out if you’re an iOS developer. Or even if you’re not and you want an example of how to do coding screencasts well.
Got tired of dead-end googling so I checked to see if @NSScreencast had covered what I was looking for. Of course he had, 4 years ago. Should have checked there first.
One 13-minute episode of @NSScreencast just paid for the yearly subscription fee in amount of time saved. Do it.
Seriously great stuff even for seasoned developers. I’ve learned a good amount from Ben’s videos.
You can really expand your development horizons in just a few minutes a week with NSScreencast.
Random PSA for iOS developers: @NSScreencast is a great resource, and worth every penny. It’s high quality, practical, and honest.
Can’t say enough good things about @NSScreencast There is gold in the Road Trip DJ Series.
I just reuppped my subscription to @NSScreencast. [An] indespensible resource if you’re into iOS or Mac Development.
Just finished @NSScreencast series on Modern CollectionViews. Strongly recommended. Programmatic UI, nicely structured code, easily approachable explanation style. 👌
#441
Paging between views is something that is not yet provided by SwiftUI, but we can lean on UIViewControllerRepresentable to borrow this behavior from UIKit. Doing so we'll learn about the Coordinator design for handling events via delegates and datasources. We'll also see some of the rough edges you might run into when using this technique.
#440
It can be cumbersome to pass values from parent to child view to configure something. For instance, setting a font for many Text views inside of a VStack. Luckily there is a .font() modifier that can do this for you. How does it work? It sets a value in the Environment using an EnvironmentKey. In this episode we will learn how to leverage the SwiftUI environment to pass values to descendent views, regardless of their depth from where it is set.
#439
Using Preferences we can communicate data, such as the actual size of a view, to any ancestor view. By taking advantage of the reduce function required by the PreferenceKey protocol, we can combine multiple values in whatever way suits our needs. In this episode we will use this technique to size a bunch of sibling views equally by collecting the biggest width and then pushing this value down to subviews with some parent state.
#438
In SwiftUI we use State to push values from a parent to a child. What if you want to go the other way, passing data about a child up to a parent? To do this we can leverage Preferences. In this episode we will see how to define a custom preference key, how to use an overlay with a GeometryReader to measure the size of a view, and then set a preference with the view's size. Then we'll learn how to respond to preference changes in an ancestor view.
#437
Buttons in SwiftUI are much more flexible than UIButton in UIKit. For starters, there is no assumption that our buttons are just text or an image, they can use any view whatsoever for the content, which is called the "label". Using Button Styles we can create buttons in whatever shape or form we desire. In this episode we create three different button styles using SwiftUI to show how flexible they are and how easy they are to reuse.
#436
With extensions we can encapsulate common layout and styling logic that can be reused across many views, however they do have limitations. In this episode we will see how we can create View Modifiers that allow you to leverage @State and other View-related behavior and apply this behavior to arbitrary views.
#435
In UIKit we use imperative code to do things like display alerts, but in SwiftUI we have a declarative structure. In this episode we will see how this changes how we work with alerts. We'll look at two ways of showing alerts, one with a simple boolean state variable, and one with a bindable identifiable type that is passed to our alert, which we use to show a specific error message if an operation fails.
#434
In UIKit we've often lamented the fact that there is no builtin facility to load an image with a URL, leaving developers to implement this on their own. In SwiftUI the situation is the same, however we have more flexibility to build what we need. Using a Swift package called FetchImage, we will create a reusable ImageView struct that can load our images efficiently given a URL.
#433
With SwiftUI views we no longer have view controllers, and this can pose the question: Where does our data access and networking code live? In this episode we will load some data from a movies API in order to examine the ObservableObject protocol.
#432
The Breathe app on watchOS has a really excellent animation. In this episode we attempt to recreate this animation in SwiftUI using offsets, rotation, and scaling, then making the animation repeat forever.
#431
SwiftUI is really fun and easy to work with, but what if you need to work with a view that already exists? This episode covers the UIViewRepresentable protocol and we use it to provide a UIActivityIndicatorView to SwiftUI. The same approach can be used to wrap your own custom UIViews as well.
#430
In this episode we add the ability to provide modal content from outside of the modal view. To do this we can leverage @ViewBuilder which is a type of Function Builder. This is a new Swift feature that gives SwiftUI's syntax a DSL rather than writing out vanilla Swift syntax.
#429
In this episode we look at designing a modal card that takes advantage of ZStack, HStack, VStack and the Spacer helper.
#428
The Keychain is the best place to store sensitive data such as API keys, auth tokens, and login credentials. On device the data is stored encrypted. Once unlocked, you can retrieve the values you saved, keeping the sensitive data secured by the user's passcode, Face ID, or Touch ID. Using the keychain is not very straightforward, however. It has a low-level C-adapted API and is a little cumbersome to work with. In this episode we will look at how to add, query, and remove items from the keychain, then look at a popular open-source library for making storing values in the keychain much easier to implement.
#427
Property wrappers are turning out to be super useful! In this video we'll look at an open-source library called ValidatedPropertyKit, which gives you property wrappers for validating user input. With it you can check for ranges, non-empty strings, regular expressions, or extend it with your own.
#426
Last time we saw the manual approach to parsing XML. While ultra flexible, parsing XML that is extremely tedious. In this episode we will examine a different approach using Codable and a 3rd party library that adds support for XML. We'll see how XML's flexibility adds some increased complexity with how to parse documents, how to control whether properties are encoded/decoded as elements or attributes and how to deal with nested arrays.
#425
Sometimes legacy APIs that we have to deal with only support XML, and while Swift has first class support for JSON with Codable, XML parsing is still done with Foundation's XMLParser. This is a powerful yet difficult to use class that is modeled as a streaming XML parser. This means you have to write some code that keeps track of the values and state of where we are in the XML document in order to parse it. In this episode we will cover how to parse an XML document using multiple objects, parsers, and a delegate stack.
#424
When working with Codable models, everything is great until you deviate even slightly from the normal behavior. Doing so requires you to drop down to a more manual approach where you have to define your own CodingKeys enum and encode/decode methods. In this episode we will look at a 3rd party set of property wrappers that give you some handy Codable functionality for free.
#423
Swift 5.1 introduced a powerful new feature to the language: Property Wrappers. In this video we will take a look at how to write property wrappers and how to use them to simplify code in our apps.
#422
In the last episode we had a bit of an issue... I was trying to store an enum value in UserDefaults, thinking it would automatically use the backing rawValue to store and load the value. Unfortunately this doesn't work. In this episode we fix this issue and extend our solution to also accommodate other data types by leveraging Codable and a custom protocol.
#421
UserDefaults is quite a handy class for storing user user preferences and lightweight data. However the data is keyed by strings and there's no enforcement of any schema or validation of the data you put in it. In this episode we will look at a technique for making strongly typed access to data in UserDefaults so that we can avoid mistakes when typing the key name or the type of data intended to be written to that key.
#420
Now that Swift Package Manager has started to see some adoption and we have some integration inside of Xcode, I think it's time to take a deeper look at how to use it both as a consumer and as a library author. In this episode we'll create a DiceKit library using SwiftPM, then use it in a command line utility.
#419
To wrap up this series, we add a new model to track and persist the progress of playing episodes. We also restore the player and playback position when coming back from a cold launch.
#418
In this episode we create the UI for our playlist screen, showing episodes from each of the subscribed podcasts. On this screen we combine NSFetchedResultsController with UITableViewDiffableDatasource so that our playlist screen can react to changes to the underlying data and reload as necessary. We do this using the automaticallyMergesChangesFromParent on our NSManagedObjectContext.