Explore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.

All subtopics
Posts under UI Frameworks topic

Post

Replies

Boosts

Views

Activity

SwiftUI Picker does cause unresponsive views
Using the native SwiftUI.Picker to set a @State which is then used to render different child views based on the selected state (using a switch-case inside body) seems to cause those child views to be unresponsive. The following code below is a replicates the issue. The solution I am currently using is to build my own custom Picker that relies on SwiftUI.Buttons to set the state. This works. enum PickerSelection: Hashable { case binding, ownState } struct MainApp: View { @State private var pickerSelection: PickerSelection? = nil @State private var isToggled: Bool = false var body: some View { VStack(alignment: .leading) { /// Changing `pickerSelection` via `SwiftUI.Picker` causes child views' toggles to be unresponsive. Picker("Picker", selection: $pickerSelection) { Text("No Option").tag(Optional<PickerSelection>(nil)) Text("Binding").tag(PickerSelection.binding) Text("Own state").tag(PickerSelection.ownState) } /// Changing `pickerSelection` via a custom `Button`-based picker works as expected. CustomPickerWithButtonBased(pickerSelection: $pickerSelection) switch pickerSelection { case .binding: ChildViewWithBinding(isToggled: $isToggled) case .ownState: ChildViewManagingOwnState() case .none: EmptyView() } Spacer() } .padding() } } struct ChildViewWithBinding: View { @Binding var isToggled: Bool var body: some View { Toggle("ChildViewWithBinding", isOn: $isToggled) } } struct ChildViewManagingOwnState: View { @State private var isToggled: Bool = false var body: some View { Toggle("ChildViewManagingOwnState", isOn: $isToggled) } } struct CustomPickerWithButtonBased: View { @Binding var pickerSelection: PickerSelection? var body: some View { HStack { Button { pickerSelection = .binding } label: { Text("Binding") } Button { pickerSelection = .ownState } label: { Text("OwnState") } } } } Am I missing something with Picker?
1
0
91
May ’25
Specific ARKit node not showing in AR
After two types of objects correctly inserted as nodes in an augmented reality setting, I replicated exactly the same procedure with a third kind of objects that unfortunately refuse to show up. I checked the flow and it is the same as the other objects as well the content of the LocationAnnotation, but there is surely something that escapes me. Could someone help with some ideas? This is the common code, apart of the class: func appendInAR(ghostElement: Ghost){ let ghostElementAnnotationLocation=GhostLocationAnnotationNode(ghost: ghostElement) ghostElementAnnotationLocation.scaleRelativeToDistance = true sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: ghostElementAnnotationLocation) shownGhostsAnnotations.append(ghostElementAnnotationLocation) }
9
0
191
Jun ’25
NWPathMonitor Failing
I need to check the network connection with NWPathMonitor. import Foundation import Network class NetworkViewModel: ObservableObject { let monitor = NWPathMonitor() let queue = DispatchQueue(label: "NetworkViewModel") @Published var isConnected = false var connectionDescription: String { if isConnected { return "You are connected." } else { return "You are NOT connected." } } init() { monitor.pathUpdateHandler = { path in DispatchQueue.main.async { self.isConnected = path.status == .satisfied } } monitor.start(queue: queue) } } import SwiftUI struct ContentView: View { @StateObject private var networkViewModel = NetworkViewModel() var body: some View { VStack { } .onAppear { if networkViewModel.isConnected { print("You are connected.") } else { print("You are NOT connected.") } } } } So there is nothing special, not at all. Yet, if I test it with a totally new Xcode project for iOS, it fails and return !isConnected. I've tested it with a macOS application. And it fails. I've tested it with an actual device. It fails. I've tested it with an old project. It still does work. I have no mere idea why new Xcode projects all fail to detect the WiFi connection. This is a total nightmare. Does anybody have a clue? thanks.
7
0
303
May ’25
NSDocument disregards save panel!
In a previous post entitled “Save fails after Save As” I described a strange problem involving the Save and Save As operations in a macOS app I wrote: see https://developer.apple.com/forums/thread/779755. Since that posting (unanswered up to now) I tried various modifications of my app, in order better to understand the problem. Now, at the time of that posting I was using a version of the app that attempted — clumsily and incompletely — to circumvent the problem. Since then I decided to eliminate from my app this unsuccessful workaround. My app is called Goperfekt (it’s in the App Store) and is meant for macOS 11 to 15. I recently created a “bare bones” version of the app: this bare-bones version is called Goperf and contains the bare minimum necessary to save and open files of the exact same two file types as in Goperfekt, namely gop (an exported type that conforms to public.data), sgf (an imported type that conforms to public.text). Goperf and Goperfekt both use dataAfType:error: as their writing method. (Yes, Objective-C… but I’ve been working on that app on and off for nearly twenty years and when Swift came out my Obj-C project was already too advanced…) The problem is the following. In Goperfekt under macOS 15 the Save and Save As operations do not work as they should (see description below). In Goperfekt under macOS 12 and 11 the Save and Save As operations work perfectly, just as they should. (Unfortunately I do not have machines running macOS 14 or 13 at the moment.) Goperf, the bare-bones version, on the other hand, works perfectly in all three versions of macOS that I have (11, 12, 15). Here is a description of the problem with Goperfekt under macOS 15. The precise app behavior described below presupposes that the user has activated the option System Settings/Desktop & Dock/Windows/Ask to keep changes when closing documents. If you deactivate this option, the app misbehaves similarly, though somewhat differently. First three important facts (Goperfekt and Goperf in macOS 11, 12, 15): I can open an already existing gop file, modify the document, and save it in that gop file, or save it as another gop file, without any problem. I can also open an already existing sgf file, modify the document, and save it in that sgf file, or save it as another sgf file, without any problem. I can also save a new document as a gop file. BUT in Goperfekt in macOS 15 it is possible neither to save a new document as an sgf file, nor to open a gop file and save it as an sgf file, IN CASES 1 AND 2 the parameter typeName received by dataOfType:error: is not “com.red-bean.sgf” (corresponding to the imported sgf extension) as it should, but “com.florrain.goperfekt-document” (corresponding to the exported gop extension). The result is a file with the sgf extension (such as “A.sgf”, as specified in the save panel), but this file is really a gop file with the wrong extension! You can see that by asking Goperfekt to open “A.sgf” (which will generate an alert), or by opening "A.sgf” in TextEdit. You can also add .gop to the name “A.sgf” and then ask Goperfekt to open “A.sgf.gop”, which it will do without a problem. Nor is it possible to open an sgf file and save it as a gop file. Here the parameter typeName received by dataOfType:error: is not “com.florrain.goperfekt-document” (the exported type) as it should, but “com.red-bean.sgf” (the imported type). The result is a file with the gop extension (such as “A.gop”, as specified in the save panel), but this file is really an sgf file with the wrong extension! You can see that by asking Goperfekt to open “A.gop” (which will generate an alert), or by opening "A.gop” in TextEdit. You can also add .sgf to the name “A.gop” and then ask Goperfekt to open “A.gop.sgf”, which it will do without a problem. Somewhere behind the scenes (only in Goperfekt on macOS 15) NSDocument disregards what was specified by the user in the save panel and sends to dataAfType:error: the wrong file type! Why on Earth? If, after having created a file “A.sgf” that is really a gop file, I change something in the document and try to save this change in “A.sgf”, the system displays a somewhat puzzling alert, and diagnostic messages appear in the Xcode console. According to the circumstances, these messages can contain such puzzling labels as NSFileSandboxingRequestRelatedItemExtension or NSFileCoordinator. Similarly for a file “A.gop” that is really an sgf file. Conclusion: search as I may, I could not find what makes Goperfekt misbehave in macOS 15 but not in macOS 11 or 12, while the bare-bones Goperf behaves perfectly in all three versions.
Topic: UI Frameworks SubTopic: AppKit Tags:
3
0
183
Jun ’25
Scroll offset incorrectly resets when animating insertion of ScrollView using .geometryGroup()
Hey, I've been having a problem with scroll views in combination with the .geometryGroup() modifier. I have filed a Feedback (FB17698293) but I also wanted to post this here in case someone maybe has a better workaround for the problem. Problem Whenever you conditionally insert a ScrollView inside a VStack that is modified with a .geometryGroup() modifier, the scroll view content offset resets itself after the insertion animation is done, even if you started scrolling inside the scroll view during the animation and haven't let go of the screen. This happens consistently and is fully reproducible (see below), both using a simulator and a real device. Unfortunately, this is a very annoying glitch that ruins a lot of cool UX components that rely on .geometryGroup(). The weird thing is that the glitch entirely disappears, if you add a simple, non-zero (but greater than 1) .padding() modifier to the VStack (.padding().geometryGroup()). I have no idea why this fixes the glitch, but it does. However, adding a padding is not feasible in many situations, so this workaround is not ideal. Steps to reproduce Launch the code below (using a simulator or a real device) and tap "Toggle Expansion" to insert the scroll view. As the view is animating in, drag the scroll content and hold it scrolled away from the top. Wait for the animation to complete. The scroll view will reset the content offset, even though the drag gesture is still active (i.e. you haven't lifted your finger to release the scroll view) On a real device, this sometimes even leads to an even worse visual artifact where the scroll view is rendered twice for a few frames; once with the correct offset, and once with the reset offset. I wanted to include a link to a gif/video showing the glitch, but it tells me that imgur is not allowed on the forums. Expected Behavior I want the scroll view to respect the content offset, even if I started changing it mid-animation. Xcode Version I am using Xcode 16.4 (16F6) but this problem has been occurring since the .geometryGroup() modifier has been release. I was only now able to pinpoint this problem exactly, so I'm filing this feedback. Code The entire code that reproduces the problem: import SwiftUI struct ContentView: View { @State private var isExpanded: Bool = false var body: some View { VStack { if isExpanded { ScrollView { Text(loremIpsum) } } Button("Toggle Expansion") { isExpanded.toggle() } } // .padding(10) // Adding a non-zero padding makes the glitch disappear .frame(maxWidth: .infinity) .geometryGroup() .animation(.default, value: isExpanded) } } #Preview { ContentView().preferredColorScheme(.dark) } // MARK: - Mock Data let loremIpsum = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt \ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco \ laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ mollit anim id est laborum. """
Topic: UI Frameworks SubTopic: SwiftUI
0
0
151
May ’25
Fatal error: Duplicate keys of type 'AnyHashable2' were found in a Dictionary.
I have encountered the following error and reduced my code to the minimum necessary to reliably reproduce this error. Fatal error: Duplicate keys of type 'AnyHashable2' were found in a >Dictionary. This usually means either that the type violates Hashable's >requirements, or that members of such a dictionary were mutated after insertion. It occurs when instances of a swiftdata model are inserted (the error occurs reliably when inserting five or more instances. Fewer insertions seems to make the error either more rare or go away entirely) and a Picker with .menu pickerStyle is present. Any of the following changes prevents the error from occuring: adding id = UUID() to the Item class removing .tag(item) in the picker content using any pickerStyle other than .menu using an observable class instead of a swiftdata class I would greatly appreciate if anyone knows what exactly is going on here. Tested using XCode Version 16.4 (16F6), iPhone 16 Pro iOS 18.5 Simulator and iPhone 15 Pro iOS 18.5 real device. import SwiftUI import SwiftData @Model class Item { var name: String init(name: String) { self.name = name } } struct DuplicateKeysErrorView: View { @Environment(\.modelContext) private var modelContext @Query(sort: \Item.name) private var items: [Item] @State var selection: Item? = nil var body: some View { List { Picker("Picker", selection: $selection) { Text("Nil").tag(nil as Item?) ForEach(items) { item in Text(item.name).tag(item) } } .pickerStyle(.menu) Button("Add 5 items") { modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) } } .onAppear { try! modelContext.delete(model: Item.self) } } } #Preview { DuplicateKeysErrorView() .modelContainer(for: Item.self) }
1
0
195
Jun ’25
`SwiftUI.Table` Select and Done buttons breaking navigation on iPadOS?
https://github.com/apple/sample-food-truck Hi! I'm following along with the sample-food-truck application from WWDC 2022. I'm seeing some weird navigation issues when building the app for iPadOS. The Table component displays a Select Button for selecting elements and a Done Button disabling that state. These buttons seem to be breaking something about navigation on iOS 18.4.1. It's a nondeterministic issue… but tapping the buttons seems to lead to some corrupt state where the app transitions out of OrdersView and back to TruckView. This code from FoodTruckModel seems to be making a difference: Task(priority: .background) { var generator = OrderGenerator.SeededRandomGenerator(seed: 5) for _ in 0..<20 { try? await Task.sleep(nanoseconds: .secondsToNanoseconds(.random(in: 3 ... 8, using: &generator))) Task { @MainActor in withAnimation(.spring(response: 0.4, dampingFraction: 1)) { self.orders.append(orderGenerator.generateOrder(number: orders.count + 1, date: .now, generator: &generator)) } } } } Commenting out that code and disabling the new Order values coming in seems to fix the issue. Is there any public documentation for me to learn about the Select and Done buttons? I don't see anywhere for me to learn about how these work and what my ability is to customize their behavior. Any ideas? I can repro from device and simulator.
2
0
128
May ’25
iPadOS26: UITabBar doesn't switch selected state
With iPadOS26, if I create a UITabBar, and use that to switch between views, the selected state never updates. I created this simple UIViewController to demonstrate the issue: class SimpleTabBarController: UIViewController, UITabBarDelegate { let tabBar = UITabBar() let redItem = UITabBarItem(title: "Red", image: nil, tag: 0) let blueItem = UITabBarItem(title: "Blue", image: nil, tag: 1) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white tabBar.items = [redItem, blueItem] tabBar.selectedItem = redItem tabBar.delegate = self tabBar.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tabBar) NSLayoutConstraint.activate([ tabBar.leadingAnchor.constraint(equalTo: view.leadingAnchor), tabBar.trailingAnchor.constraint(equalTo: view.trailingAnchor), tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) updateBackground(for: redItem) } func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { updateBackground(for: item) } private func updateBackground(for item: UITabBarItem) { switch item.tag { case 0: view.backgroundColor = .systemRed case 1: view.backgroundColor = .systemBlue default: view.backgroundColor = .white } } } The tabBar didSelect item method is called, and the background color gets updated as expected, but the selected state of the UITabBar stays the same. I files a feedback for a related issue: FB17841678
1
0
316
Jun ’25
Dock tile plugin and app groups
In one of my apps I use an app group to share data between the app and a command line tool. This works as expected. The app also contains a Dock Tile plugin and I wonder if there's a way to access the group container from this plugin? Thanks in advance for your help. Best regards, Marc
5
0
475
May ’25
Shouldn't SwiftUI only re-renders if var is used on view?
Why is the SwiftUI re-render the UI event if the view does not use the counter like in the example bellow...shouldn't SwiftUI framework be smart enough to detect that?? import SwiftUI class ViewModel: ObservableObject { @Published var counter: Int = 0 // Not used in the view's body @Published var displayText: String = "Hello" // Used in the view's body } struct ContentView: View { @StateObject private var viewModel = ViewModel() var body: some View { VStack { Text(viewModel.displayText) // Depends on displayText } .onChange(of: viewModel.counter) { newValue in print("Counter changed to: \(newValue)") } } } Is there any solution more elegant without using Publishers??
2
0
212
Jun ’25
AppEntity with @Parameter Options Works in Shortcuts App but Not with Siri
I’m working with AppIntents and AppEntity to integrate my app’s data model into Shortcuts and Siri. In the example below, I define a custom FoodEntity and use it as a @Parameter in an AppIntent. I’m providing dynamic options for this parameter via an optionsProvider. In the Shortcuts app, everything works as expected: when the user runs the shortcut, they get a list of food options (from the dynamic provider) to select from. However, in Siri, the experience is different. Instead of showing the list of options, Siri asks the user to say the name of the food, and then tries to match it using EntityStringQuery. I originally assumed this might be a design decision to allow hands-free use with voice, but I found that if you use an AppEnum instead, Siri does present a tappable list of options. So now I’m wondering: why the difference? Is there a way to get the @Parameter with AppEntity + optionsProvider to show a tappable list in Siri like it does in Shortcuts or with an AppEnum? Any clarification on how EntityQuery.suggestedEntities() and DynamicOptionsProvider interact with Siri would be appreciated! struct CaloriesShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: AddCaloriesInteractive(), phrases: [ "Add to \(.applicationName)" ], shortTitle: "Calories", systemImageName: "fork" ) } } struct AddCaloriesInteractive: AppIntent { static var title: LocalizedStringResource = "Add to calories log" static var description = IntentDescription("Add Calories using Shortcuts.") static var openAppWhenRun: Bool = false static var parameterSummary: some ParameterSummary { Summary("Calorie Entry SUMMARY") } var displayRepresentation: DisplayRepresentation { DisplayRepresentation(stringLiteral:"Add to calorie log") } @Dependency private var persistenceManager: PersistenceManager @Parameter(title: LocalizedStringResource("Food"), optionsProvider: FoodEntityOptions()) var foodEntity: FoodEntity @MainActor func perform() async throws -> some IntentResult & ProvidesDialog { return .result(dialog: .init("Added \(foodEntity.name) to calorie log")) } } struct FoodEntity: AppEntity { static var defaultQuery = FoodEntityQuery() @Property var name: String @Property var calories: Int init(name: String, calories: Int) { self.name = name self.calories = calories } static var typeDisplayRepresentation: TypeDisplayRepresentation { TypeDisplayRepresentation(name: "Calorie Entry") } static var typeDisplayName: LocalizedStringResource = "Calorie Entry" var displayRepresentation: AppIntents.DisplayRepresentation { DisplayRepresentation(title: .init(stringLiteral: name), subtitle: "\(calories)") } var id: String { return name } } struct FoodEntityQuery: EntityQuery { func entities(for identifiers: [FoodEntity.ID]) async throws -> [FoodEntity] { var result = [FoodEntity]() for identifier in identifiers { if let entity = FoodDatabase.allEntities().first(where: { $0.id == identifier }) { result.append(entity) } } return result } func suggestedEntities() async throws -> [FoodEntity] { return FoodDatabase.allEntities() } } extension FoodEntityQuery: EntityStringQuery { func entities(matching string: String) async throws -> [FoodEntity] { return FoodDatabase.allEntities().filter({$0.name.localizedCaseInsensitiveCompare(string) == .orderedSame}) } } struct FoodEntityOptions: DynamicOptionsProvider { func results() async throws -> ItemCollection<FoodEntity> { ItemCollection { ItemSection("Section 1") { for entry in FoodDatabase.allEntities() { entry } } } } } struct FoodDatabase { // Fake data static func allEntities() -> [FoodEntity] { [ FoodEntity(name: "Orange", calories: 2), FoodEntity(name: "Banana", calories: 2) ] } }
0
1
111
May ’25
SwiftData/ModelSnapshot.swift:46: Fatal error: A ModelSnapshot must be initialized with a known-keys dictionary
I'm running into a crash when trying to delete an item from a list that's loaded using SwiftData. The app works fine when selecting or displaying the data, but the moment I confirm a deletion, it crashes with this error: SwiftData/ModelSnapshot.swift:46: Fatal error: A ModelSnapshot must be initialized with a known-keys dictionary This happens right after I delete an item from the list using modelContext.delete(). I’ve double-checked that the item exists and is valid, and I'm not sure what I'm doing wrong. The data is loaded using @Query and everything seems normal until deletion. For further information, I have tried this on a new IOS project where I have one super Model class with a cascading relationship on a child class. When trying to delete the parent class while connected to one or more children, it still gives me the error. The same thing is happening with my original project. Class A has a relationship (cascading) with Class B. Attempting to delete Class A while there are relationships with Class B throws this error. If anyone has experienced this or knows what causes it, please let me know. I’m not even sure where to start debugging this one. Thanks in advance!
2
1
245
May ’25
iOS26 WWDC25 large inline navigation?
How to achieve the same navigation bar style as in the Design foundations from idea to interface - WWDC25 video? Screenshot: https://imgur.com/a/huzsm1H There's no new navigationBarTitleDisplayMode that has action buttons aligned with the title.
1
0
216
Jun ’25
Room Plan Issue (structure.capturedStructure)
Hi everyone, My app crashed when using the merge room feature. I suspect the issue might be caused by a wall having more than 4 edges. Has anyone experienced a similar problem and found a solution? I’d really appreciate any advice or suggestions. Thank you all, and have a great day! let capturedStructure = try await structure.capturedStructure(from: self.rooms)
2
1
278
May ’25
Pencil "Touches" on Catalyst are interrupted with modifier
I'm working on a catalyst video editor and I'm using my wacom graphic tablet to work. The wacom input gets translated into a pencil touch. Whenever I hold down a modifier (shift, cmd etc) the touch gets ended and also ends all gestures. The mouse (indirectPointer touch) doesn't exhibit this kind of behavior. Is this expected behavior? If so is there a way to opt out? Any way to prevent this? This basically makes the typical transform gestures impossible to do when using the graphic tablet.
2
0
159
Jun ’25
Ios 26 clock widget not dynamically updating in mobile.
Ios 26 clock widget not dynamically updating in mobile.
Replies
1
Boosts
0
Views
156
Activity
Jun ’25
SwiftUI Picker does cause unresponsive views
Using the native SwiftUI.Picker to set a @State which is then used to render different child views based on the selected state (using a switch-case inside body) seems to cause those child views to be unresponsive. The following code below is a replicates the issue. The solution I am currently using is to build my own custom Picker that relies on SwiftUI.Buttons to set the state. This works. enum PickerSelection: Hashable { case binding, ownState } struct MainApp: View { @State private var pickerSelection: PickerSelection? = nil @State private var isToggled: Bool = false var body: some View { VStack(alignment: .leading) { /// Changing `pickerSelection` via `SwiftUI.Picker` causes child views' toggles to be unresponsive. Picker("Picker", selection: $pickerSelection) { Text("No Option").tag(Optional<PickerSelection>(nil)) Text("Binding").tag(PickerSelection.binding) Text("Own state").tag(PickerSelection.ownState) } /// Changing `pickerSelection` via a custom `Button`-based picker works as expected. CustomPickerWithButtonBased(pickerSelection: $pickerSelection) switch pickerSelection { case .binding: ChildViewWithBinding(isToggled: $isToggled) case .ownState: ChildViewManagingOwnState() case .none: EmptyView() } Spacer() } .padding() } } struct ChildViewWithBinding: View { @Binding var isToggled: Bool var body: some View { Toggle("ChildViewWithBinding", isOn: $isToggled) } } struct ChildViewManagingOwnState: View { @State private var isToggled: Bool = false var body: some View { Toggle("ChildViewManagingOwnState", isOn: $isToggled) } } struct CustomPickerWithButtonBased: View { @Binding var pickerSelection: PickerSelection? var body: some View { HStack { Button { pickerSelection = .binding } label: { Text("Binding") } Button { pickerSelection = .ownState } label: { Text("OwnState") } } } } Am I missing something with Picker?
Replies
1
Boosts
0
Views
91
Activity
May ’25
Link, SwiftUI bug?, button trait identified on VoiceOver for a link.
In SwiftUI, a link is identified as both a button and link, this is during when running with VoiceOver. I know you can remove the button trait using .accessibilityRemoveTraits. However, I am sure there is a reason to it. Can somebody explain if it is genuinely a bug.
Replies
1
Boosts
1
Views
309
Activity
Jun ’25
Highlight the model not with the eyes, but by clicking a button
Hello, we have a requirement where clicking a button will highlight the model, similar to the effect seen by the eyes. However, the eyes do not see it and it is achieved by clicking a button. What should we do? Thank you for your reply
Replies
0
Boosts
0
Views
146
Activity
Jun ’25
Specific ARKit node not showing in AR
After two types of objects correctly inserted as nodes in an augmented reality setting, I replicated exactly the same procedure with a third kind of objects that unfortunately refuse to show up. I checked the flow and it is the same as the other objects as well the content of the LocationAnnotation, but there is surely something that escapes me. Could someone help with some ideas? This is the common code, apart of the class: func appendInAR(ghostElement: Ghost){ let ghostElementAnnotationLocation=GhostLocationAnnotationNode(ghost: ghostElement) ghostElementAnnotationLocation.scaleRelativeToDistance = true sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: ghostElementAnnotationLocation) shownGhostsAnnotations.append(ghostElementAnnotationLocation) }
Replies
9
Boosts
0
Views
191
Activity
Jun ’25
NWPathMonitor Failing
I need to check the network connection with NWPathMonitor. import Foundation import Network class NetworkViewModel: ObservableObject { let monitor = NWPathMonitor() let queue = DispatchQueue(label: "NetworkViewModel") @Published var isConnected = false var connectionDescription: String { if isConnected { return "You are connected." } else { return "You are NOT connected." } } init() { monitor.pathUpdateHandler = { path in DispatchQueue.main.async { self.isConnected = path.status == .satisfied } } monitor.start(queue: queue) } } import SwiftUI struct ContentView: View { @StateObject private var networkViewModel = NetworkViewModel() var body: some View { VStack { } .onAppear { if networkViewModel.isConnected { print("You are connected.") } else { print("You are NOT connected.") } } } } So there is nothing special, not at all. Yet, if I test it with a totally new Xcode project for iOS, it fails and return !isConnected. I've tested it with a macOS application. And it fails. I've tested it with an actual device. It fails. I've tested it with an old project. It still does work. I have no mere idea why new Xcode projects all fail to detect the WiFi connection. This is a total nightmare. Does anybody have a clue? thanks.
Replies
7
Boosts
0
Views
303
Activity
May ’25
NSDocument disregards save panel!
In a previous post entitled “Save fails after Save As” I described a strange problem involving the Save and Save As operations in a macOS app I wrote: see https://developer.apple.com/forums/thread/779755. Since that posting (unanswered up to now) I tried various modifications of my app, in order better to understand the problem. Now, at the time of that posting I was using a version of the app that attempted — clumsily and incompletely — to circumvent the problem. Since then I decided to eliminate from my app this unsuccessful workaround. My app is called Goperfekt (it’s in the App Store) and is meant for macOS 11 to 15. I recently created a “bare bones” version of the app: this bare-bones version is called Goperf and contains the bare minimum necessary to save and open files of the exact same two file types as in Goperfekt, namely gop (an exported type that conforms to public.data), sgf (an imported type that conforms to public.text). Goperf and Goperfekt both use dataAfType:error: as their writing method. (Yes, Objective-C… but I’ve been working on that app on and off for nearly twenty years and when Swift came out my Obj-C project was already too advanced…) The problem is the following. In Goperfekt under macOS 15 the Save and Save As operations do not work as they should (see description below). In Goperfekt under macOS 12 and 11 the Save and Save As operations work perfectly, just as they should. (Unfortunately I do not have machines running macOS 14 or 13 at the moment.) Goperf, the bare-bones version, on the other hand, works perfectly in all three versions of macOS that I have (11, 12, 15). Here is a description of the problem with Goperfekt under macOS 15. The precise app behavior described below presupposes that the user has activated the option System Settings/Desktop & Dock/Windows/Ask to keep changes when closing documents. If you deactivate this option, the app misbehaves similarly, though somewhat differently. First three important facts (Goperfekt and Goperf in macOS 11, 12, 15): I can open an already existing gop file, modify the document, and save it in that gop file, or save it as another gop file, without any problem. I can also open an already existing sgf file, modify the document, and save it in that sgf file, or save it as another sgf file, without any problem. I can also save a new document as a gop file. BUT in Goperfekt in macOS 15 it is possible neither to save a new document as an sgf file, nor to open a gop file and save it as an sgf file, IN CASES 1 AND 2 the parameter typeName received by dataOfType:error: is not “com.red-bean.sgf” (corresponding to the imported sgf extension) as it should, but “com.florrain.goperfekt-document” (corresponding to the exported gop extension). The result is a file with the sgf extension (such as “A.sgf”, as specified in the save panel), but this file is really a gop file with the wrong extension! You can see that by asking Goperfekt to open “A.sgf” (which will generate an alert), or by opening "A.sgf” in TextEdit. You can also add .gop to the name “A.sgf” and then ask Goperfekt to open “A.sgf.gop”, which it will do without a problem. Nor is it possible to open an sgf file and save it as a gop file. Here the parameter typeName received by dataOfType:error: is not “com.florrain.goperfekt-document” (the exported type) as it should, but “com.red-bean.sgf” (the imported type). The result is a file with the gop extension (such as “A.gop”, as specified in the save panel), but this file is really an sgf file with the wrong extension! You can see that by asking Goperfekt to open “A.gop” (which will generate an alert), or by opening "A.gop” in TextEdit. You can also add .sgf to the name “A.gop” and then ask Goperfekt to open “A.gop.sgf”, which it will do without a problem. Somewhere behind the scenes (only in Goperfekt on macOS 15) NSDocument disregards what was specified by the user in the save panel and sends to dataAfType:error: the wrong file type! Why on Earth? If, after having created a file “A.sgf” that is really a gop file, I change something in the document and try to save this change in “A.sgf”, the system displays a somewhat puzzling alert, and diagnostic messages appear in the Xcode console. According to the circumstances, these messages can contain such puzzling labels as NSFileSandboxingRequestRelatedItemExtension or NSFileCoordinator. Similarly for a file “A.gop” that is really an sgf file. Conclusion: search as I may, I could not find what makes Goperfekt misbehave in macOS 15 but not in macOS 11 or 12, while the bare-bones Goperf behaves perfectly in all three versions.
Topic: UI Frameworks SubTopic: AppKit Tags:
Replies
3
Boosts
0
Views
183
Activity
Jun ’25
Scroll offset incorrectly resets when animating insertion of ScrollView using .geometryGroup()
Hey, I've been having a problem with scroll views in combination with the .geometryGroup() modifier. I have filed a Feedback (FB17698293) but I also wanted to post this here in case someone maybe has a better workaround for the problem. Problem Whenever you conditionally insert a ScrollView inside a VStack that is modified with a .geometryGroup() modifier, the scroll view content offset resets itself after the insertion animation is done, even if you started scrolling inside the scroll view during the animation and haven't let go of the screen. This happens consistently and is fully reproducible (see below), both using a simulator and a real device. Unfortunately, this is a very annoying glitch that ruins a lot of cool UX components that rely on .geometryGroup(). The weird thing is that the glitch entirely disappears, if you add a simple, non-zero (but greater than 1) .padding() modifier to the VStack (.padding().geometryGroup()). I have no idea why this fixes the glitch, but it does. However, adding a padding is not feasible in many situations, so this workaround is not ideal. Steps to reproduce Launch the code below (using a simulator or a real device) and tap "Toggle Expansion" to insert the scroll view. As the view is animating in, drag the scroll content and hold it scrolled away from the top. Wait for the animation to complete. The scroll view will reset the content offset, even though the drag gesture is still active (i.e. you haven't lifted your finger to release the scroll view) On a real device, this sometimes even leads to an even worse visual artifact where the scroll view is rendered twice for a few frames; once with the correct offset, and once with the reset offset. I wanted to include a link to a gif/video showing the glitch, but it tells me that imgur is not allowed on the forums. Expected Behavior I want the scroll view to respect the content offset, even if I started changing it mid-animation. Xcode Version I am using Xcode 16.4 (16F6) but this problem has been occurring since the .geometryGroup() modifier has been release. I was only now able to pinpoint this problem exactly, so I'm filing this feedback. Code The entire code that reproduces the problem: import SwiftUI struct ContentView: View { @State private var isExpanded: Bool = false var body: some View { VStack { if isExpanded { ScrollView { Text(loremIpsum) } } Button("Toggle Expansion") { isExpanded.toggle() } } // .padding(10) // Adding a non-zero padding makes the glitch disappear .frame(maxWidth: .infinity) .geometryGroup() .animation(.default, value: isExpanded) } } #Preview { ContentView().preferredColorScheme(.dark) } // MARK: - Mock Data let loremIpsum = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt \ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco \ laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ mollit anim id est laborum. """
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
151
Activity
May ’25
Fatal error: Duplicate keys of type 'AnyHashable2' were found in a Dictionary.
I have encountered the following error and reduced my code to the minimum necessary to reliably reproduce this error. Fatal error: Duplicate keys of type 'AnyHashable2' were found in a >Dictionary. This usually means either that the type violates Hashable's >requirements, or that members of such a dictionary were mutated after insertion. It occurs when instances of a swiftdata model are inserted (the error occurs reliably when inserting five or more instances. Fewer insertions seems to make the error either more rare or go away entirely) and a Picker with .menu pickerStyle is present. Any of the following changes prevents the error from occuring: adding id = UUID() to the Item class removing .tag(item) in the picker content using any pickerStyle other than .menu using an observable class instead of a swiftdata class I would greatly appreciate if anyone knows what exactly is going on here. Tested using XCode Version 16.4 (16F6), iPhone 16 Pro iOS 18.5 Simulator and iPhone 15 Pro iOS 18.5 real device. import SwiftUI import SwiftData @Model class Item { var name: String init(name: String) { self.name = name } } struct DuplicateKeysErrorView: View { @Environment(\.modelContext) private var modelContext @Query(sort: \Item.name) private var items: [Item] @State var selection: Item? = nil var body: some View { List { Picker("Picker", selection: $selection) { Text("Nil").tag(nil as Item?) ForEach(items) { item in Text(item.name).tag(item) } } .pickerStyle(.menu) Button("Add 5 items") { modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) modelContext.insert(Item(name: UUID().uuidString)) } } .onAppear { try! modelContext.delete(model: Item.self) } } } #Preview { DuplicateKeysErrorView() .modelContainer(for: Item.self) }
Replies
1
Boosts
0
Views
195
Activity
Jun ’25
`SwiftUI.Table` Select and Done buttons breaking navigation on iPadOS?
https://github.com/apple/sample-food-truck Hi! I'm following along with the sample-food-truck application from WWDC 2022. I'm seeing some weird navigation issues when building the app for iPadOS. The Table component displays a Select Button for selecting elements and a Done Button disabling that state. These buttons seem to be breaking something about navigation on iOS 18.4.1. It's a nondeterministic issue… but tapping the buttons seems to lead to some corrupt state where the app transitions out of OrdersView and back to TruckView. This code from FoodTruckModel seems to be making a difference: Task(priority: .background) { var generator = OrderGenerator.SeededRandomGenerator(seed: 5) for _ in 0..<20 { try? await Task.sleep(nanoseconds: .secondsToNanoseconds(.random(in: 3 ... 8, using: &generator))) Task { @MainActor in withAnimation(.spring(response: 0.4, dampingFraction: 1)) { self.orders.append(orderGenerator.generateOrder(number: orders.count + 1, date: .now, generator: &generator)) } } } } Commenting out that code and disabling the new Order values coming in seems to fix the issue. Is there any public documentation for me to learn about the Select and Done buttons? I don't see anywhere for me to learn about how these work and what my ability is to customize their behavior. Any ideas? I can repro from device and simulator.
Replies
2
Boosts
0
Views
128
Activity
May ’25
iPadOS26: UITabBar doesn't switch selected state
With iPadOS26, if I create a UITabBar, and use that to switch between views, the selected state never updates. I created this simple UIViewController to demonstrate the issue: class SimpleTabBarController: UIViewController, UITabBarDelegate { let tabBar = UITabBar() let redItem = UITabBarItem(title: "Red", image: nil, tag: 0) let blueItem = UITabBarItem(title: "Blue", image: nil, tag: 1) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white tabBar.items = [redItem, blueItem] tabBar.selectedItem = redItem tabBar.delegate = self tabBar.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tabBar) NSLayoutConstraint.activate([ tabBar.leadingAnchor.constraint(equalTo: view.leadingAnchor), tabBar.trailingAnchor.constraint(equalTo: view.trailingAnchor), tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) updateBackground(for: redItem) } func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { updateBackground(for: item) } private func updateBackground(for item: UITabBarItem) { switch item.tag { case 0: view.backgroundColor = .systemRed case 1: view.backgroundColor = .systemBlue default: view.backgroundColor = .white } } } The tabBar didSelect item method is called, and the background color gets updated as expected, but the selected state of the UITabBar stays the same. I files a feedback for a related issue: FB17841678
Replies
1
Boosts
0
Views
316
Activity
Jun ’25
Dock tile plugin and app groups
In one of my apps I use an app group to share data between the app and a command line tool. This works as expected. The app also contains a Dock Tile plugin and I wonder if there's a way to access the group container from this plugin? Thanks in advance for your help. Best regards, Marc
Replies
5
Boosts
0
Views
475
Activity
May ’25
Shouldn't SwiftUI only re-renders if var is used on view?
Why is the SwiftUI re-render the UI event if the view does not use the counter like in the example bellow...shouldn't SwiftUI framework be smart enough to detect that?? import SwiftUI class ViewModel: ObservableObject { @Published var counter: Int = 0 // Not used in the view's body @Published var displayText: String = "Hello" // Used in the view's body } struct ContentView: View { @StateObject private var viewModel = ViewModel() var body: some View { VStack { Text(viewModel.displayText) // Depends on displayText } .onChange(of: viewModel.counter) { newValue in print("Counter changed to: \(newValue)") } } } Is there any solution more elegant without using Publishers??
Replies
2
Boosts
0
Views
212
Activity
Jun ’25
AppEntity with @Parameter Options Works in Shortcuts App but Not with Siri
I’m working with AppIntents and AppEntity to integrate my app’s data model into Shortcuts and Siri. In the example below, I define a custom FoodEntity and use it as a @Parameter in an AppIntent. I’m providing dynamic options for this parameter via an optionsProvider. In the Shortcuts app, everything works as expected: when the user runs the shortcut, they get a list of food options (from the dynamic provider) to select from. However, in Siri, the experience is different. Instead of showing the list of options, Siri asks the user to say the name of the food, and then tries to match it using EntityStringQuery. I originally assumed this might be a design decision to allow hands-free use with voice, but I found that if you use an AppEnum instead, Siri does present a tappable list of options. So now I’m wondering: why the difference? Is there a way to get the @Parameter with AppEntity + optionsProvider to show a tappable list in Siri like it does in Shortcuts or with an AppEnum? Any clarification on how EntityQuery.suggestedEntities() and DynamicOptionsProvider interact with Siri would be appreciated! struct CaloriesShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: AddCaloriesInteractive(), phrases: [ "Add to \(.applicationName)" ], shortTitle: "Calories", systemImageName: "fork" ) } } struct AddCaloriesInteractive: AppIntent { static var title: LocalizedStringResource = "Add to calories log" static var description = IntentDescription("Add Calories using Shortcuts.") static var openAppWhenRun: Bool = false static var parameterSummary: some ParameterSummary { Summary("Calorie Entry SUMMARY") } var displayRepresentation: DisplayRepresentation { DisplayRepresentation(stringLiteral:"Add to calorie log") } @Dependency private var persistenceManager: PersistenceManager @Parameter(title: LocalizedStringResource("Food"), optionsProvider: FoodEntityOptions()) var foodEntity: FoodEntity @MainActor func perform() async throws -> some IntentResult & ProvidesDialog { return .result(dialog: .init("Added \(foodEntity.name) to calorie log")) } } struct FoodEntity: AppEntity { static var defaultQuery = FoodEntityQuery() @Property var name: String @Property var calories: Int init(name: String, calories: Int) { self.name = name self.calories = calories } static var typeDisplayRepresentation: TypeDisplayRepresentation { TypeDisplayRepresentation(name: "Calorie Entry") } static var typeDisplayName: LocalizedStringResource = "Calorie Entry" var displayRepresentation: AppIntents.DisplayRepresentation { DisplayRepresentation(title: .init(stringLiteral: name), subtitle: "\(calories)") } var id: String { return name } } struct FoodEntityQuery: EntityQuery { func entities(for identifiers: [FoodEntity.ID]) async throws -> [FoodEntity] { var result = [FoodEntity]() for identifier in identifiers { if let entity = FoodDatabase.allEntities().first(where: { $0.id == identifier }) { result.append(entity) } } return result } func suggestedEntities() async throws -> [FoodEntity] { return FoodDatabase.allEntities() } } extension FoodEntityQuery: EntityStringQuery { func entities(matching string: String) async throws -> [FoodEntity] { return FoodDatabase.allEntities().filter({$0.name.localizedCaseInsensitiveCompare(string) == .orderedSame}) } } struct FoodEntityOptions: DynamicOptionsProvider { func results() async throws -> ItemCollection<FoodEntity> { ItemCollection { ItemSection("Section 1") { for entry in FoodDatabase.allEntities() { entry } } } } } struct FoodDatabase { // Fake data static func allEntities() -> [FoodEntity] { [ FoodEntity(name: "Orange", calories: 2), FoodEntity(name: "Banana", calories: 2) ] } }
Replies
0
Boosts
1
Views
111
Activity
May ’25
Found a bug in ios26 UI on iphone 12
In keyboard shortcuts this buttons at the bottom are overlappin. Any one else?
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
85
Activity
Jun ’25
SwiftData/ModelSnapshot.swift:46: Fatal error: A ModelSnapshot must be initialized with a known-keys dictionary
I'm running into a crash when trying to delete an item from a list that's loaded using SwiftData. The app works fine when selecting or displaying the data, but the moment I confirm a deletion, it crashes with this error: SwiftData/ModelSnapshot.swift:46: Fatal error: A ModelSnapshot must be initialized with a known-keys dictionary This happens right after I delete an item from the list using modelContext.delete(). I’ve double-checked that the item exists and is valid, and I'm not sure what I'm doing wrong. The data is loaded using @Query and everything seems normal until deletion. For further information, I have tried this on a new IOS project where I have one super Model class with a cascading relationship on a child class. When trying to delete the parent class while connected to one or more children, it still gives me the error. The same thing is happening with my original project. Class A has a relationship (cascading) with Class B. Attempting to delete Class A while there are relationships with Class B throws this error. If anyone has experienced this or knows what causes it, please let me know. I’m not even sure where to start debugging this one. Thanks in advance!
Replies
2
Boosts
1
Views
245
Activity
May ’25
iOS26 WWDC25 large inline navigation?
How to achieve the same navigation bar style as in the Design foundations from idea to interface - WWDC25 video? Screenshot: https://imgur.com/a/huzsm1H There's no new navigationBarTitleDisplayMode that has action buttons aligned with the title.
Replies
1
Boosts
0
Views
216
Activity
Jun ’25
Using multiple Line Styles on a single Line Mark
Hello, I am wondering if it is possible to have a Line Mark with different line styles. I am trying to create a Line Mark where part of the line is solid and another part of the line is dashed. Even with a conditional it only displays one or the other. Is it currently possible in SwiftCharts to do something like the attached image? Thank you.
Replies
1
Boosts
1
Views
211
Activity
Jun ’25
Room Plan Issue (structure.capturedStructure)
Hi everyone, My app crashed when using the merge room feature. I suspect the issue might be caused by a wall having more than 4 edges. Has anyone experienced a similar problem and found a solution? I’d really appreciate any advice or suggestions. Thank you all, and have a great day! let capturedStructure = try await structure.capturedStructure(from: self.rooms)
Replies
2
Boosts
1
Views
278
Activity
May ’25
Pencil "Touches" on Catalyst are interrupted with modifier
I'm working on a catalyst video editor and I'm using my wacom graphic tablet to work. The wacom input gets translated into a pencil touch. Whenever I hold down a modifier (shift, cmd etc) the touch gets ended and also ends all gestures. The mouse (indirectPointer touch) doesn't exhibit this kind of behavior. Is this expected behavior? If so is there a way to opt out? Any way to prevent this? This basically makes the typical transform gestures impossible to do when using the graphic tablet.
Replies
2
Boosts
0
Views
159
Activity
Jun ’25