Post

Replies

Boosts

Views

Activity

Reply to AppDelegate can be nil?
I actually ran into an example of UIApplication.shared.delegate being nil today. During the init of your app delegate, UIApplication.shared.delegate is nil. So if something needs to access the app delegate immediately after super.init() there's a possibility its still nil. For me, I populated my dependency root for dependency injection here. I added a line of code to one of my services that needed to access the app delegate and it was nil. Other than this, I can't think of any other possible times that it would be nil.
Nov ’20
Reply to How do I use async/await with NotificationCenter?
I figured out what was wrong with it: this was what I was doing: for await _ in NotificationCenter.default.notifications(named: UIDevice.orientationDidChangeNotification, object: self) { print("orientation changed") // This would never fire } I changed it to: for await _ in NotificationCenter.default.notifications(named: UIDevice.orientationDidChangeNotification) { print("orientation changed") // This works } I guess I misunderstood what that object param was used for.
Nov ’21
Reply to Command CompileAssetCatalog failed with a nonzero exit code
I seem to have solved the issue. Purged Xcode from my machine again. Including all caches. Deleted the contents of the /Library/Developer folder restarted my machine installed command line tools with Xcode-select --install redownloaded Xcode I think the PrivateFrameworks folder inside of /Library/Developer/ was the culprit. Its last modified time was when I installed Xcode 14 beta, not the last time I reinstalled Xcode 13.4.1 I imagine some of the stuff the simulator runtime relies on was corrupted.
Jul ’22
Reply to SwiftUI Navigation Stack pops back on ObservableObject update
This is because your observable object is being used by both a view that is hosting a navigation view, and one of the children being presented by a navigation view. So when the child updates the observable object, it causes the parent to reload. Which in turn causes its navigation stack to be drawn from scratch as well. the solution is to decouple the parent from the observable object. So it’s not reloading each time it changes. A technique I use is to wrap an observable object inside another. What this does it it allows me to inject them via @EnvironmentObject, without causing the views to reload unnecessarily. class Dependency<T: ObservableObject>: ObservableObject { let observable: T init(observable: T) { self.observable = observable } }
Dec ’22
Reply to UINavigationController has a delay rendering a UIHostingController's .navigationBarTitle(), .searchable(), and .toolbar()
I found a somewhat hacky workaround for this. You can "pre-render" the navigation bar customization so that it does not appear to pop in. This is not ideal though. Hopefully someone at apple fixes it. As it pretty much makes programmatic navigation in a mixed codebase impossible. let hostingController = UIHostingController(rootView: MyViewWithASearchBar()) hostingController.title = "My search page title" // pre-render the search bar let searchController = UISearchController() if #available(iOS 16.0, *) { hostingController.navigationItem.preferredSearchBarPlacement = .stacked } hostingController.navigationItem.searchController = searchController hostingController.navigationItem.hidesSearchBarWhenScrolling = false navigationController.pushViewController(hostingController, animated: true)
Oct ’23
Reply to SwiftUI I want to display a loading screen on the entire screen when displaying a sheet
Not sure if this would work. But you could try something like this: struct LoadingPreferenceKey: PreferenceKey { var defaultValue: Bool = false static func reduce(value: inout Self.Value, nextValue: () -> Self.Value) { value = nextValue() } } struct RootView: View { @State var loading: Bool = false var body: some View { ContentView() .fullScreenCover(isPresented: $loading) { MyLoadingView() } .onPreferenceChange(LoadingPreferenceKey.self) { isLoading in loading = true } } } struct ContentView: View { @State private var showingSheet = false var body: some View { Button("Sheet Open") { self.showingSheet.toggle() } .sheet(isPresented: $showingSheet) { SheetView() } } } struct SheetView: View {   @State var isLoading = false var body: some View { ZStack{ VStack{ Text("SheetView") Button("Submit Data"){ isLoading = true // Submitting now...... isLoading = false } } if isLoading { ZStack{ Color.white.opacity(0.5) .ignoresSafeArea() .frame(width: geometry.size.width, height: geometry.size.height) ProgressView() } } } .preference(LoadingPreferenceKey.self, isLoading) } }
Oct ’23