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

How to detect iPad trackpad touch-down (indirectPointer) to immediately stop coasting animation
Hello, I have a custom 3D object viewer on iOS that lets users spin the model using the touchscreen or a trackpad and supports coasting (momentum spinning). I need to stop the coasting animation as soon as the user touches down, but I can only immediately detect touches on the screen itself - on the trackpad I can't get an immediate notification of the touches. So far I’ve tried: State.began on my UIPanGestureRecognizer. It only fires after a small movement on both touchscreen and trackpad. .possible on the pan gesture; this state never occurs during the gesture cycle. UIApplicationSupportsIndirectInputEvents = YES in Info.plist; it didn’t make touchesBegan fire for indirectPointer touches. Since UITableView (and other UIScrollView subclasses) clearly detect trackpad “touch-down” to cancel scrolling, there must be a way to receive that event. Does anyone know how to catch the initial trackpad contact—before any movement—on an indirect input device? Below is a minimal code snippet demonstrating the issue. On the touchscreen you'll see a message the moment you touch the view, but the trackpad doesn't trigger any messages until your fingers move. Any advice would be greatly appreciated. Thanks in advance, John import UIKit class ViewController: UIViewController { private let debugView = DebugView() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // Fill the screen with our debug view debugView.frame = view.bounds debugView.autoresizingMask = [.flexibleWidth, .flexibleHeight] debugView.backgroundColor = UIColor(white: 0.95, alpha: 1) view.addSubview(debugView) // Attach a pan recognizer that logs its state let panGR = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:))) panGR.allowedScrollTypesMask = .all debugView.addGestureRecognizer(panGR) } @objc private func handlePan(_ gr: UIPanGestureRecognizer) { switch gr.state { case .possible: print("Pan state: possible") case .began: print("Pan state: began") case .changed: print("Pan state: changed – translation = \(gr.translation(in: debugView))") case .ended: print("Pan state: ended – velocity = \(gr.velocity(in: debugView))") case .cancelled: print("Pan state: cancelled") case .failed: print("Pan state: failed") @unknown default: print("Pan state: unknown") } } } class DebugView: UIView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) for t in touches { let typeDesc: String switch t.type { case .direct: typeDesc = "direct (finger)" case .indirectPointer: typeDesc = "indirectPointer (trackpad/mouse)" case .indirect: typeDesc = "indirect (Apple TV remote)" case .pencil: typeDesc = "pencil (Apple Pencil)" @unknown default: typeDesc = "unknown" } print("touchesBegan on DebugView – touch type: \(typeDesc), location: \(t.location(in: self))") } } }
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
115
Apr ’25
searchable isPresented set too late in a sheet
I have a popover/sheet in iOS which allows users to search and add items to a list. When the sheet is shown, the search should always be active. I am using searchable on a NavigationStack inside the sheet. I am using the isPresented parameter to activate search. My issue is with the animation of the search activation. Even if I use... isPresented: .constant(true) ...the search isn't activated until the sheet has completed it's entrance animation, resulting in two stages of animation. I can't add a video here, but the two images below show the steps I am seeing. First a slide up animation, with the search in the navigation drawer, then a second animation, once the sheet is fully in place, as the search becomes active. Is it possible to merge these two animations, so search is in place when the sheet animates up?
Topic: UI Frameworks SubTopic: SwiftUI
0
0
55
Apr ’25
Setting UserDefaults in Preview
Hello, I've got a View that loads data from UserDefaults. I want to set the value of the UserDefault in the preview so i can see how it looks while developing. However when i am trying to set it in preview, i get the following error when i try set it in preview. 'buildExpression' is unavailable: this expression does not conform to 'View' What is the correct way to set the user defaults in preview? import Foundation class PreferencesViewModel: ObservableObject { @Published var maximumDistance: Double = UserDefaults.standard.value(for: .maximumDistance) as? Double ?? PreferencesViewModel.maximumDistanceOptions[0] { didSet { UserDefaults.standard.set(maximumDistance, for: .maximumDistance) } } #Preview { let preferencesViewModel = PreferencesViewModel() preferencesViewModel.maximumDistance = 5.0 PreferencesView() .environmentObject(PreferencesViewModel()) }
2
0
138
Apr ’25
App Crashes on Paper Selection After Background Printer Connection
Description: When initiating the print flow via UIPrintInteractionController, and no printer is initially connected, iOS displays all possible paper sizes in the paper selection UI. However, if a printer connects in the background after this view is shown, the list of paper sizes does not automatically refresh to reflect only the options supported by the connected printer. If the user selects an incompatible paper size (one not supported by the printer that has just connected), the app crashes due to an invalid configuration. Steps to Reproduce: Launch the app and navigate to the print functionality. Tap the Print button to invoke UIPrintInteractionController. At this point, no printer is yet connected. iOS displays all available paper sizes. While the paper selection UI is visible, the AirPrint-compatible printer connects in the background. Without dismissing the controller, the user selects a paper size (e.g., one that is not supported by the printer). The app crashes. Expected Result: App should not crash Once the printer becomes available (connected in the background), the paper size options should refresh automatically. The list should be filtered to only include sizes that are compatible with the connected printer. This prevents the user from selecting an invalid option, avoiding crashes. Actual Result: App crashes The paper size list remains unfiltered. The user can still select unsupported paper sizes. Selecting an incompatible option causes the app to crash, due to a mismatch between UI selection and printer capability.
Topic: UI Frameworks SubTopic: UIKit
0
0
97
Apr ’25
RealityView in UIHostingController/UIKit transparency
I'm experimenting with RealityView in the UI of an AUv3 plug-in. The plug-in UI is implemented in a UIKitViewController with a UIHostingController hosting a RealityView. When i run the standalone app on visionOS I want the background to be transparent, and the reality view content. how can i achieve that? I've tried turning off opaque in many views and and setting background colors to .clear.
1
0
75
Apr ’25
SwiftUI Button is not tappable if an Image is followed in a VStack
Here is the code: import SwiftUI struct ContentView: View { var body: some View { VStack(alignment: .leading, spacing: 8) { Button(action: { print("Tapped the button") }, label: { Text("Button") .foregroundStyle(Color.white) .padding() .background(Color.gray) }) .border(Color.green, width: 2) Image(systemName: "square.and.arrow.up") .resizable() .aspectRatio(contentMode: .fill) .foregroundStyle(Color.black) .frame(height: 240) .border(Color.blue, width: 2) .clipped() } .padding() .border(Color.black, width: 2) } } #Preview { ContentView() } The problem is that the button is not tappable. Test environment: macOS 15.3.2 (24D81), Xcode Version 16.2 (16C5032a), Simulator: iPhone 16 (18.3.1) However, if we change the code from ".aspectRatio(contentMode: .fill)" to ".aspectRatio(contentMode: .fit)" then the problem goes away. Any suggestions to fix the problem?
Topic: UI Frameworks SubTopic: SwiftUI
3
0
128
Apr ’25
NSTableView.clickedRow sometimes is greater than number of rows
Xcode has been downloading many similar crash reports for my app for some time now, related to an index out of range runtime exception when accessing a Swift array. The crashes always happen in methods triggered by user input or during menu item validation when I try to access the data source array by using the following code to determine the indexes of the relevant table rows: let indexes = clickedRow == -1 || selectedRowIndexes.contains(clickedRow) ? selectedRowIndexes : IndexSet(integer: clickedRow) I was never able to reproduce the crash until today. When the app crashed in the Xcode debugger, I examined the variables clickedRow and selectedRowIndexes.first, which were 1 and 0 respectively. What's interesting: the table view only contained one row, so clickedRow was effectively invalid. I tried to reproduce the issue several times afterwards, but it never happened again. What could cause this issue? What are the circumstances where it is invalid? Do I always have to explicitly check if clickedRow is within the data source range?
Topic: UI Frameworks SubTopic: AppKit Tags:
4
0
104
Apr ’25
Cannot access current path from NavigationPath — need breadcrumb trail like Files app
I’m building an app similar to the Files app, where users navigate through folders using a NavigationStack with a bound NavigationPath. I need to display the current path — meaning a breadcrumb-like UI that shows the folder hierarchy the user has drilled down into. However, I’m running into a big limitation: We can’t access the current values inside NavigationPath. It doesn’t conform to Sequence, and there’s no documented way to extract the typed path elements to construct a path string like Documents / MyFolder / Subfolder. To work around this, I tried maintaining a separate [FileItem] array alongside NavigationPath, and that works well in iOS 17+ and iOS 18. But when I test on iOS 16, and navigate to another detail view in my NavigationSplitView, the app crashes. I searched around and found others hit this issue too — switching back to NavigationPath fixes the crash, but now I’m back to square one: I can’t figure out the current folder path from the stack. So my questions are: • Is there any supported way to access the current typed values from NavigationPath in a safe and supported way? • Or is there another Apple-recommended approach for this kind of breadcrumb behavior in apps using NavigationStack? Would really appreciate insight from Apple or anyone who’s solved this cleanly, especially with iOS 16 compatibility in mind. Thanks!
Topic: UI Frameworks SubTopic: SwiftUI
1
0
72
Apr ’25
Clearing Change Count in FileDocument?
I'm playing with a simple document-based application with TextEditor for macOS. In Cocoa, NSViewController can call updateChangeCount(_:) to clear document changes in NSDocument. I wonder SwiftUI's View has access to the same function? Hopefully, I would like to manually set the change count to zero if the user clears text in TextEditor. I bet SwiftUI doesn't have it. Thanks. import SwiftUI struct ContentView: View { @Binding var document: SampleDocumentApp var body: some View { VStack { TextEditor(text: $document.text) .onChange(of: document.text) { _, _ in guard !document.text.isEmpty else { return } // clear change count // } } .frame(width: 360, height: 240) } }
2
0
78
Apr ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
2
0
126
Apr ’25
The @Environment(\.dismiss) value in SwiftUI for macOS does not dismiss a sheet presented by an NSWindowController.
I'm wondering what the correct, or recommended, way is to dismiss a SwiftUI that is being presented as a sheet hosted by an NSHostingController. The usual technique of invoking @Environment(\.dismiss) does not appear to work. Consider the code below. An NSWindowController is attempting to display a SwiftUI SettingsView as a sheet. The sheet is correctly presented, but the SettingsView is unable to dismiss itself. I am able to make it work by passing a closure into SettingsView that calls back to the NSWindowController but it's rather convoluted because SettingsView doesn't know the view controller that's hosting it until after SettingsView has been created, which means "finding" that view controller in the window controller to dismiss is more involved than it should be. Is there a better strategy to leverage here? final class MyViewController: NSViewController { @IBAction func buttonClicked(_ sender: NSButton) { if let presenter = window?.contentViewController { presenter.presentAsSheet(NSHostingController(rootView: SettingsView())) } } } struct SettingsView: View { @Environment(\.dismiss) private var dismiss var body: some View { VStack { Button("Cancel", role: .cancel) { dismiss() // This call does not dismiss the sheet. } .keyboardShortcut(.cancelAction) } } } Thank you. macOS 15.4.1 (24E263), Xcode 16.3 (16E140)
0
0
97
Apr ’25
Problems visualizing UIApplicationShortcutIcon with shortcuts
Hi Everybody, I am actually developing dynamic shortcuts for my app. I have a problem with the class UIApplicationShortcutIcon. When I pass a personalized icon in the parameter icon as a UIApplicationShortcutIcon(templateImageName: "nameOfTheAsset" I always visualize a black dot instead of my Icon. The icon is imported as .SVG file and rendered as a template. Sincerely I do not know what to do to solve this problem since the documentation is little. Hoping somebody can give some tips to solve the problem
1
0
71
Apr ’25
Extra Trailing Closure for List {}
I am a little lost. Why is Xcode complaining of this. Everything looks right here. I even removed my code and copy-pasted Apple's sample from here - https://aninterestingwebsite.com/documentation/swiftui/list Clean built and still get this. Not using List removes the error.
4
0
105
Apr ’25
Scrolling up in List after having quickly scrolled down becomes jumpy
There seems to be a bug; when scrolling very quickly down a List, and then scrolling up at normal speed, scrolling becomes very janky and jumpy, often skipping one or two rows. This only happens on macOS. I'm kind of surprised I've seen no one else mention this bug, as I can recreate it in a very simple Xcode Project. I'm wondering if anyone knows of a workaround? Steps to reproduce: Build and launch the code below Very quickly scroll all the way down using the scrollbar Scroll up at a normal speed, after a few rows it will get janky Code: struct MinimalAlbum: Identifiable { let id: Int let title: String } struct ContentView: View { private let staticAlbums: [MinimalAlbum] = (0..<1000).map { i in MinimalAlbum(id: i, title: "Album Title \(i)") } var body: some View { List { ForEach(staticAlbums) { album in Text("Album ID: \(album.id) - \(album.title)") .frame(height: 80) // Fixed height } } } }
2
0
119
Apr ’25
NSOpenPanel fails with NSUserDefaults domain 'nil' under SDL2 with macOS Sequoia . SDL2 C++
This is with SDL2 and C++ Due to the new security design of Sequoia involving the sandboxed helper processes (via ViewBridge) to show open/save panels, my existing code for invoking Open/SaveAs/FolderSelect dialogs no longer works and instead terminates with ViewBridge Code=14 "(null)" error. Even in the simplest of forms such as; nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, nfdnchar_t** outPath, const nfdopendialognargs_t* args) { nfdresult_t result = NFD_CANCEL; NSOpenPanel* dialog = [NSOpenPanel openPanel]; if ([dialog runModal] == NSModalResponseOK) { result = NFD_OKAY; } return result; } ...Will no longer work. My Question is essentially, how can I resolve this NSUserDefaults domain empty/nil issue ( currently I don't pass anything for sharing defaults during the process ). Dump of fault provided in crash.txt ( the program doesn't actually crash, it just doesn't invoke the file-open dialog ) crash.txt
1
1
222
Apr ’25
Xcode UIKit Document App template crashes under Swift 6
I'm trying to switch to UIKit's document lifecycle due to serious bugs with SwiftUI's version. However I'm noticing the template project from Xcode isn't compatible with Swift 6 (I already migrated my app to Swift 6.). To reproduce: File -> New -> Project Select "Document App" under iOS Set "Interface: UIKit" In Build Settings, change Swift Language Version to Swift 6 Run app Tap "Create Document" Observe: crash in _dispatch_assert_queue_fail Does anyone know of a work around other than downgrading to Swift 5?
0
1
113
Apr ’25
Arabic Text Appears Reversed and Broken in SwiftUI Lists, TextFields, and Pickers
Hello, I would like to report a critical issue with Arabic text rendering in SwiftUI apps on iOS and iPadOS. When using Arabic as the default language (Right-to-Left - RTL), Arabic text appears reversed and disconnected inside several SwiftUI components like: List Section TextField Picker Custom views (like StudentRowView) Even though the environment is set to .layoutDirection(.rightToLeft), the dynamic Arabic text is not rendered properly. Static headers display correctly, but any dynamic content (student names, notes, field titles) becomes broken and unreadable. Examples where the issue occurs: AboutView.swift → Arabic text inside List and Section SettingsView.swift → TextField placeholders and Picker options StudentRowView.swift → Student names and grade field titles Environment: SwiftUI 5 (Xcode 15+) iOS 17+ Reproducible 100% on both Simulator and real devices. Expected Behavior: Arabic text should appear properly connected, right-aligned, and readable without any manual workaround for each Text or TextField. Workarounds Tried: Manually setting .multilineTextAlignment(.trailing) (inefficient) Wrapping every Text inside an HStack with Spacer (hacky) Building custom UIKit views (defeats purpose of SwiftUI simplicity) Formal Feedback: I have submitted a Feedback Assistant report We hope this issue will be prioritized and fixed to improve SwiftUI's support for Arabic and other RTL languages. Thank you.
1
0
167
Apr ’25
Focused Views Get Clipped When Using NavigationStack or Form in Split-Screen Layout on tvOS
When attempting to replicate the tvOS Settings menu layout, where the screen is divided horizontally into two sections, placing a NavigationStack or a Form view on either side of the screen causes focusable views (such as Button, TextField, Toggle, etc.) to be visually clipped when they receive focus and apply the default scaling animation. Specifically: If the Form or NavigationStack is placed on the right side, the left edge of the focused view gets clipped. If placed on the left side, the right edge of the focused view gets clipped. This issue affects any focusable child view inside the Form or NavigationStack when focus scaling is triggered. Example code: struct TVAppMenuMainView: View { var body: some View { VStack { Text("Settings Menu") .font(.title) HStack { VStack { Text("Left Pane") } .frame(width: UIScreen.main.bounds.width * 0.4) // represents only 40% of the screen .frame(maxHeight: .infinity) .padding(.bottom) Divider() NavigationStack { Form { // All the buttons will get cut on the left side when each button is focused Button("First Button"){} Button("Second Button"){} Button("Third Button"){} Button("Forth Button"){} } } } .frame(maxHeight: .infinity) .frame(maxWidth: .infinity) } .background(.ultraThickMaterial) } } How it looks: What I have tried: .clipped modifiers .ignoresSafeArea Modifying the size manually Using just a ScrollView with VStack works as intended, but as soon as NavigationStack or Form are added, the buttons get clipped. This was tested on the latest 18.5 tvOS BETA
0
0
92
Apr ’25
How to detect iPad trackpad touch-down (indirectPointer) to immediately stop coasting animation
Hello, I have a custom 3D object viewer on iOS that lets users spin the model using the touchscreen or a trackpad and supports coasting (momentum spinning). I need to stop the coasting animation as soon as the user touches down, but I can only immediately detect touches on the screen itself - on the trackpad I can't get an immediate notification of the touches. So far I’ve tried: State.began on my UIPanGestureRecognizer. It only fires after a small movement on both touchscreen and trackpad. .possible on the pan gesture; this state never occurs during the gesture cycle. UIApplicationSupportsIndirectInputEvents = YES in Info.plist; it didn’t make touchesBegan fire for indirectPointer touches. Since UITableView (and other UIScrollView subclasses) clearly detect trackpad “touch-down” to cancel scrolling, there must be a way to receive that event. Does anyone know how to catch the initial trackpad contact—before any movement—on an indirect input device? Below is a minimal code snippet demonstrating the issue. On the touchscreen you'll see a message the moment you touch the view, but the trackpad doesn't trigger any messages until your fingers move. Any advice would be greatly appreciated. Thanks in advance, John import UIKit class ViewController: UIViewController { private let debugView = DebugView() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // Fill the screen with our debug view debugView.frame = view.bounds debugView.autoresizingMask = [.flexibleWidth, .flexibleHeight] debugView.backgroundColor = UIColor(white: 0.95, alpha: 1) view.addSubview(debugView) // Attach a pan recognizer that logs its state let panGR = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:))) panGR.allowedScrollTypesMask = .all debugView.addGestureRecognizer(panGR) } @objc private func handlePan(_ gr: UIPanGestureRecognizer) { switch gr.state { case .possible: print("Pan state: possible") case .began: print("Pan state: began") case .changed: print("Pan state: changed – translation = \(gr.translation(in: debugView))") case .ended: print("Pan state: ended – velocity = \(gr.velocity(in: debugView))") case .cancelled: print("Pan state: cancelled") case .failed: print("Pan state: failed") @unknown default: print("Pan state: unknown") } } } class DebugView: UIView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) for t in touches { let typeDesc: String switch t.type { case .direct: typeDesc = "direct (finger)" case .indirectPointer: typeDesc = "indirectPointer (trackpad/mouse)" case .indirect: typeDesc = "indirect (Apple TV remote)" case .pencil: typeDesc = "pencil (Apple Pencil)" @unknown default: typeDesc = "unknown" } print("touchesBegan on DebugView – touch type: \(typeDesc), location: \(t.location(in: self))") } } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
115
Activity
Apr ’25
searchable isPresented set too late in a sheet
I have a popover/sheet in iOS which allows users to search and add items to a list. When the sheet is shown, the search should always be active. I am using searchable on a NavigationStack inside the sheet. I am using the isPresented parameter to activate search. My issue is with the animation of the search activation. Even if I use... isPresented: .constant(true) ...the search isn't activated until the sheet has completed it's entrance animation, resulting in two stages of animation. I can't add a video here, but the two images below show the steps I am seeing. First a slide up animation, with the search in the navigation drawer, then a second animation, once the sheet is fully in place, as the search becomes active. Is it possible to merge these two animations, so search is in place when the sheet animates up?
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
55
Activity
Apr ’25
Setting UserDefaults in Preview
Hello, I've got a View that loads data from UserDefaults. I want to set the value of the UserDefault in the preview so i can see how it looks while developing. However when i am trying to set it in preview, i get the following error when i try set it in preview. 'buildExpression' is unavailable: this expression does not conform to 'View' What is the correct way to set the user defaults in preview? import Foundation class PreferencesViewModel: ObservableObject { @Published var maximumDistance: Double = UserDefaults.standard.value(for: .maximumDistance) as? Double ?? PreferencesViewModel.maximumDistanceOptions[0] { didSet { UserDefaults.standard.set(maximumDistance, for: .maximumDistance) } } #Preview { let preferencesViewModel = PreferencesViewModel() preferencesViewModel.maximumDistance = 5.0 PreferencesView() .environmentObject(PreferencesViewModel()) }
Replies
2
Boosts
0
Views
138
Activity
Apr ’25
App Crashes on Paper Selection After Background Printer Connection
Description: When initiating the print flow via UIPrintInteractionController, and no printer is initially connected, iOS displays all possible paper sizes in the paper selection UI. However, if a printer connects in the background after this view is shown, the list of paper sizes does not automatically refresh to reflect only the options supported by the connected printer. If the user selects an incompatible paper size (one not supported by the printer that has just connected), the app crashes due to an invalid configuration. Steps to Reproduce: Launch the app and navigate to the print functionality. Tap the Print button to invoke UIPrintInteractionController. At this point, no printer is yet connected. iOS displays all available paper sizes. While the paper selection UI is visible, the AirPrint-compatible printer connects in the background. Without dismissing the controller, the user selects a paper size (e.g., one that is not supported by the printer). The app crashes. Expected Result: App should not crash Once the printer becomes available (connected in the background), the paper size options should refresh automatically. The list should be filtered to only include sizes that are compatible with the connected printer. This prevents the user from selecting an invalid option, avoiding crashes. Actual Result: App crashes The paper size list remains unfiltered. The user can still select unsupported paper sizes. Selecting an incompatible option causes the app to crash, due to a mismatch between UI selection and printer capability.
Topic: UI Frameworks SubTopic: UIKit
Replies
0
Boosts
0
Views
97
Activity
Apr ’25
RealityView in UIHostingController/UIKit transparency
I'm experimenting with RealityView in the UI of an AUv3 plug-in. The plug-in UI is implemented in a UIKitViewController with a UIHostingController hosting a RealityView. When i run the standalone app on visionOS I want the background to be transparent, and the reality view content. how can i achieve that? I've tried turning off opaque in many views and and setting background colors to .clear.
Replies
1
Boosts
0
Views
75
Activity
Apr ’25
SwiftUI Button is not tappable if an Image is followed in a VStack
Here is the code: import SwiftUI struct ContentView: View { var body: some View { VStack(alignment: .leading, spacing: 8) { Button(action: { print("Tapped the button") }, label: { Text("Button") .foregroundStyle(Color.white) .padding() .background(Color.gray) }) .border(Color.green, width: 2) Image(systemName: "square.and.arrow.up") .resizable() .aspectRatio(contentMode: .fill) .foregroundStyle(Color.black) .frame(height: 240) .border(Color.blue, width: 2) .clipped() } .padding() .border(Color.black, width: 2) } } #Preview { ContentView() } The problem is that the button is not tappable. Test environment: macOS 15.3.2 (24D81), Xcode Version 16.2 (16C5032a), Simulator: iPhone 16 (18.3.1) However, if we change the code from ".aspectRatio(contentMode: .fill)" to ".aspectRatio(contentMode: .fit)" then the problem goes away. Any suggestions to fix the problem?
Topic: UI Frameworks SubTopic: SwiftUI
Replies
3
Boosts
0
Views
128
Activity
Apr ’25
NSTableView.clickedRow sometimes is greater than number of rows
Xcode has been downloading many similar crash reports for my app for some time now, related to an index out of range runtime exception when accessing a Swift array. The crashes always happen in methods triggered by user input or during menu item validation when I try to access the data source array by using the following code to determine the indexes of the relevant table rows: let indexes = clickedRow == -1 || selectedRowIndexes.contains(clickedRow) ? selectedRowIndexes : IndexSet(integer: clickedRow) I was never able to reproduce the crash until today. When the app crashed in the Xcode debugger, I examined the variables clickedRow and selectedRowIndexes.first, which were 1 and 0 respectively. What's interesting: the table view only contained one row, so clickedRow was effectively invalid. I tried to reproduce the issue several times afterwards, but it never happened again. What could cause this issue? What are the circumstances where it is invalid? Do I always have to explicitly check if clickedRow is within the data source range?
Topic: UI Frameworks SubTopic: AppKit Tags:
Replies
4
Boosts
0
Views
104
Activity
Apr ’25
Cannot access current path from NavigationPath — need breadcrumb trail like Files app
I’m building an app similar to the Files app, where users navigate through folders using a NavigationStack with a bound NavigationPath. I need to display the current path — meaning a breadcrumb-like UI that shows the folder hierarchy the user has drilled down into. However, I’m running into a big limitation: We can’t access the current values inside NavigationPath. It doesn’t conform to Sequence, and there’s no documented way to extract the typed path elements to construct a path string like Documents / MyFolder / Subfolder. To work around this, I tried maintaining a separate [FileItem] array alongside NavigationPath, and that works well in iOS 17+ and iOS 18. But when I test on iOS 16, and navigate to another detail view in my NavigationSplitView, the app crashes. I searched around and found others hit this issue too — switching back to NavigationPath fixes the crash, but now I’m back to square one: I can’t figure out the current folder path from the stack. So my questions are: • Is there any supported way to access the current typed values from NavigationPath in a safe and supported way? • Or is there another Apple-recommended approach for this kind of breadcrumb behavior in apps using NavigationStack? Would really appreciate insight from Apple or anyone who’s solved this cleanly, especially with iOS 16 compatibility in mind. Thanks!
Topic: UI Frameworks SubTopic: SwiftUI
Replies
1
Boosts
0
Views
72
Activity
Apr ’25
CarPlay application inaccessible when the mobile app is terminated
Hello, When my mobile app is terminated, say 30 secs later the CarPlay app stops working. I don't get the access token that is saved in the KeyChain. The same happens when my mobile app is in background for more than 20 secs or so. Please suggest the way forward. Or is this the expected behavior?
Replies
1
Boosts
0
Views
113
Activity
Apr ’25
Clearing Change Count in FileDocument?
I'm playing with a simple document-based application with TextEditor for macOS. In Cocoa, NSViewController can call updateChangeCount(_:) to clear document changes in NSDocument. I wonder SwiftUI's View has access to the same function? Hopefully, I would like to manually set the change count to zero if the user clears text in TextEditor. I bet SwiftUI doesn't have it. Thanks. import SwiftUI struct ContentView: View { @Binding var document: SampleDocumentApp var body: some View { VStack { TextEditor(text: $document.text) .onChange(of: document.text) { _, _ in guard !document.text.isEmpty else { return } // clear change count // } } .frame(width: 360, height: 240) } }
Replies
2
Boosts
0
Views
78
Activity
Apr ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
Replies
2
Boosts
0
Views
126
Activity
Apr ’25
The @Environment(\.dismiss) value in SwiftUI for macOS does not dismiss a sheet presented by an NSWindowController.
I'm wondering what the correct, or recommended, way is to dismiss a SwiftUI that is being presented as a sheet hosted by an NSHostingController. The usual technique of invoking @Environment(\.dismiss) does not appear to work. Consider the code below. An NSWindowController is attempting to display a SwiftUI SettingsView as a sheet. The sheet is correctly presented, but the SettingsView is unable to dismiss itself. I am able to make it work by passing a closure into SettingsView that calls back to the NSWindowController but it's rather convoluted because SettingsView doesn't know the view controller that's hosting it until after SettingsView has been created, which means "finding" that view controller in the window controller to dismiss is more involved than it should be. Is there a better strategy to leverage here? final class MyViewController: NSViewController { @IBAction func buttonClicked(_ sender: NSButton) { if let presenter = window?.contentViewController { presenter.presentAsSheet(NSHostingController(rootView: SettingsView())) } } } struct SettingsView: View { @Environment(\.dismiss) private var dismiss var body: some View { VStack { Button("Cancel", role: .cancel) { dismiss() // This call does not dismiss the sheet. } .keyboardShortcut(.cancelAction) } } } Thank you. macOS 15.4.1 (24E263), Xcode 16.3 (16E140)
Replies
0
Boosts
0
Views
97
Activity
Apr ’25
Problems visualizing UIApplicationShortcutIcon with shortcuts
Hi Everybody, I am actually developing dynamic shortcuts for my app. I have a problem with the class UIApplicationShortcutIcon. When I pass a personalized icon in the parameter icon as a UIApplicationShortcutIcon(templateImageName: "nameOfTheAsset" I always visualize a black dot instead of my Icon. The icon is imported as .SVG file and rendered as a template. Sincerely I do not know what to do to solve this problem since the documentation is little. Hoping somebody can give some tips to solve the problem
Replies
1
Boosts
0
Views
71
Activity
Apr ’25
Extra Trailing Closure for List {}
I am a little lost. Why is Xcode complaining of this. Everything looks right here. I even removed my code and copy-pasted Apple's sample from here - https://aninterestingwebsite.com/documentation/swiftui/list Clean built and still get this. Not using List removes the error.
Replies
4
Boosts
0
Views
105
Activity
Apr ’25
Scrolling up in List after having quickly scrolled down becomes jumpy
There seems to be a bug; when scrolling very quickly down a List, and then scrolling up at normal speed, scrolling becomes very janky and jumpy, often skipping one or two rows. This only happens on macOS. I'm kind of surprised I've seen no one else mention this bug, as I can recreate it in a very simple Xcode Project. I'm wondering if anyone knows of a workaround? Steps to reproduce: Build and launch the code below Very quickly scroll all the way down using the scrollbar Scroll up at a normal speed, after a few rows it will get janky Code: struct MinimalAlbum: Identifiable { let id: Int let title: String } struct ContentView: View { private let staticAlbums: [MinimalAlbum] = (0..<1000).map { i in MinimalAlbum(id: i, title: "Album Title \(i)") } var body: some View { List { ForEach(staticAlbums) { album in Text("Album ID: \(album.id) - \(album.title)") .frame(height: 80) // Fixed height } } } }
Replies
2
Boosts
0
Views
119
Activity
Apr ’25
NSOpenPanel fails with NSUserDefaults domain 'nil' under SDL2 with macOS Sequoia . SDL2 C++
This is with SDL2 and C++ Due to the new security design of Sequoia involving the sandboxed helper processes (via ViewBridge) to show open/save panels, my existing code for invoking Open/SaveAs/FolderSelect dialogs no longer works and instead terminates with ViewBridge Code=14 "(null)" error. Even in the simplest of forms such as; nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, nfdnchar_t** outPath, const nfdopendialognargs_t* args) { nfdresult_t result = NFD_CANCEL; NSOpenPanel* dialog = [NSOpenPanel openPanel]; if ([dialog runModal] == NSModalResponseOK) { result = NFD_OKAY; } return result; } ...Will no longer work. My Question is essentially, how can I resolve this NSUserDefaults domain empty/nil issue ( currently I don't pass anything for sharing defaults during the process ). Dump of fault provided in crash.txt ( the program doesn't actually crash, it just doesn't invoke the file-open dialog ) crash.txt
Replies
1
Boosts
1
Views
222
Activity
Apr ’25
How to implement this textfield in SwitfUI
In Contact app on watchOS, there're some textfields. But I can not find which textfield could implement it. Any one has some idea?
Replies
3
Boosts
0
Views
86
Activity
Apr ’25
Xcode UIKit Document App template crashes under Swift 6
I'm trying to switch to UIKit's document lifecycle due to serious bugs with SwiftUI's version. However I'm noticing the template project from Xcode isn't compatible with Swift 6 (I already migrated my app to Swift 6.). To reproduce: File -> New -> Project Select "Document App" under iOS Set "Interface: UIKit" In Build Settings, change Swift Language Version to Swift 6 Run app Tap "Create Document" Observe: crash in _dispatch_assert_queue_fail Does anyone know of a work around other than downgrading to Swift 5?
Replies
0
Boosts
1
Views
113
Activity
Apr ’25
Arabic Text Appears Reversed and Broken in SwiftUI Lists, TextFields, and Pickers
Hello, I would like to report a critical issue with Arabic text rendering in SwiftUI apps on iOS and iPadOS. When using Arabic as the default language (Right-to-Left - RTL), Arabic text appears reversed and disconnected inside several SwiftUI components like: List Section TextField Picker Custom views (like StudentRowView) Even though the environment is set to .layoutDirection(.rightToLeft), the dynamic Arabic text is not rendered properly. Static headers display correctly, but any dynamic content (student names, notes, field titles) becomes broken and unreadable. Examples where the issue occurs: AboutView.swift → Arabic text inside List and Section SettingsView.swift → TextField placeholders and Picker options StudentRowView.swift → Student names and grade field titles Environment: SwiftUI 5 (Xcode 15+) iOS 17+ Reproducible 100% on both Simulator and real devices. Expected Behavior: Arabic text should appear properly connected, right-aligned, and readable without any manual workaround for each Text or TextField. Workarounds Tried: Manually setting .multilineTextAlignment(.trailing) (inefficient) Wrapping every Text inside an HStack with Spacer (hacky) Building custom UIKit views (defeats purpose of SwiftUI simplicity) Formal Feedback: I have submitted a Feedback Assistant report We hope this issue will be prioritized and fixed to improve SwiftUI's support for Arabic and other RTL languages. Thank you.
Replies
1
Boosts
0
Views
167
Activity
Apr ’25
Focused Views Get Clipped When Using NavigationStack or Form in Split-Screen Layout on tvOS
When attempting to replicate the tvOS Settings menu layout, where the screen is divided horizontally into two sections, placing a NavigationStack or a Form view on either side of the screen causes focusable views (such as Button, TextField, Toggle, etc.) to be visually clipped when they receive focus and apply the default scaling animation. Specifically: If the Form or NavigationStack is placed on the right side, the left edge of the focused view gets clipped. If placed on the left side, the right edge of the focused view gets clipped. This issue affects any focusable child view inside the Form or NavigationStack when focus scaling is triggered. Example code: struct TVAppMenuMainView: View { var body: some View { VStack { Text("Settings Menu") .font(.title) HStack { VStack { Text("Left Pane") } .frame(width: UIScreen.main.bounds.width * 0.4) // represents only 40% of the screen .frame(maxHeight: .infinity) .padding(.bottom) Divider() NavigationStack { Form { // All the buttons will get cut on the left side when each button is focused Button("First Button"){} Button("Second Button"){} Button("Third Button"){} Button("Forth Button"){} } } } .frame(maxHeight: .infinity) .frame(maxWidth: .infinity) } .background(.ultraThickMaterial) } } How it looks: What I have tried: .clipped modifiers .ignoresSafeArea Modifying the size manually Using just a ScrollView with VStack works as intended, but as soon as NavigationStack or Form are added, the buttons get clipped. This was tested on the latest 18.5 tvOS BETA
Replies
0
Boosts
0
Views
92
Activity
Apr ’25