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

TipKit
When using Tips.showAllTipsForTesting() my tips are shown repeatedly again and again after ~2 seconds on 18.4 and 18.5. It is not happening on iOS 18.1 (only tested with simulator) Is this intended? It makes debugging very difficult. Edit: Also, Tips.resetDatastore() does not seem to work as the documentation says?
2
0
233
May ’25
FamilyActivityTitleView Label has wrong text color when app is using different than system theme
Hello, In a new app I am working on I noticed the FamilyActivityTitleView that displays "ApplicationToken" has wrong (black) color when phone is set to light mode but app is using dark mode via override. We display user's selected apps and the labels are rendered correctly at first, but then when user updates selection with FamilyActivityPicker, then those newly added apps are rendered with black titles. The problem goes away when I close the screen and open it again. It also doesn't happen when phone is set to dark theme. I am currently noticing the issue on iOS 18.4.1. I have tried various workarounds like forcing white text in the custom label style, forcing re-render with custom .id value but nothing helped. Is there any way how to fix this?
0
0
153
May ’25
How to correctly set a Picker's selection and contents in SwiftUI for macOS?
How do you atomically set a Picker's selection and contents on macOS such that you don't end up in a situation where the selection is not present within the Picker's content? I presume Picker on macOS is implemented as an NSPopUpButton and an NSPopUpButton doesn't really like the concept of "no selection". SwiftUI, when presented with that, outputs: Picker: the selection "nil" is invalid and does not have an associated tag, this will give undefined results. Consider the following pseudo code: struct ParentView: View { @State private var items: [Item] var body: some View { ChildView(items: items) } } struct ChildView: View { let items: [Item] @State private var selectedItem: Item? var body: some View { Picker("", selection: $selectedItem) { ForEach(items) { item in Text(item.name).tag(item) } } } } When items gets passed down from ParentView to the ChildView, it's entirely possible that the current value in selectedItem represents an Item that is not longer in the items[] array. You can "catch" that by using .onAppear, .task, .onChange and maybe some other modifiers, but not until after at least one render pass has happened and an error has likely been reported because selectedItem is nil or it's not represented in the items[] array. Because selectedItem is private state, a value can't easily be passed down from the parent view, though even if it could that just kind of moves the problem one level higher up. What is the correct way to handle this type of data flow in SwiftUI for macOS?
1
0
215
May ’25
ssue with Session Sharing Between Safari and ASWebAuthenticationSession
We are experiencing an issue with session sharing on iOS and would appreciate your guidance. We operate and control our own OpenID Connect (OIDC) server. Our iOS application uses ASWebAuthenticationSession to authenticate users. We're unable to get the authentication session to be shared between the Safari app and the app's ASWebAuthenticationSession. This results in users having to re-authenticate despite being logged in via Safari. We've attempted various configurations related to cookie SameSite settings. These adjustments resolved the session sharing issue on Android using Chrome Custom Tabs. However, no changes we've tried have enabled session sharing to work as expected on iOS. According to documentation from Apple, Microsoft, Okta, and Auth0, session sharing between Safari and ASWebAuthenticationSession should work. Question: Are there any additional settings, configurations, or platform limitations we should be aware of that could impact session sharing on iOS? Where else can we look to resolve this issue?
Topic: UI Frameworks SubTopic: General
0
0
142
May ’25
tvOS Remote Control Entitlements
I've been looking for a solution to configure the Apple TV remote(s) from the 5th generation and upwards. Some of the basic functionalities are disabling buttons on the physical remote control while maintaining proper functionality on remote controller apps on iOS devices. There seems to be a lack of relevant entitlements in that category, and without it I can't seem to figure out a way to make it work. Any ideas on the matter? Maybe a workaround that allows to configure the Apple TV to work with other remotes? Thank you in advance to anyone that put in thought to my query.
0
0
113
May ’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
264
May ’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
465
May ’25
Application crashes when using TextEditor(text, selection)
I have a TextEditor, to the constructor of which in addition to the text I pass an object of the TextSelection? type. I check on the Simulator with iOS 18.2. An attempt to clear the text leads to a crash with the message "Thread 1: Fatal error: String index is out of bounds" in Xcode. More about the error: libswiftCore.dylib`_swift_runtime_on_report: -> 0x194f32024 <+0>: ret More about the reproduction conditions: struct MyView: View { @Bindable private var viewModel = MyViewModel() @State var myTextSelection: TextSelection? = nil var body: some View { ZStack { // Some other code myEditor // Some other code } .toolbar { ToolbarItem(placement: .primaryAction) { Button { viewModel.clear() } label: { Label("Clear", systemImage: "eraser") } } } } var myEditor: some View { ZStack(alignment: .topLeading) { TextEditor(text: $viewModel.text, selection: $myTextSelection) .disableAutocorrection(true) .autocapitalization(.sentences) } // Some other code } } MyViewModel: @Observable final class MyViewModel: ObservableObject { var text: String = "" func clear() { text = "" } }
1
0
137
May ’25
tvOS: Using .onExitCommand to Navigate to Home Tab Before Exiting — Is This Acceptable?
Hi Apple Developer Team, In my tvOS app built with SwiftUI, I have a tab-based interface with several sections. The first tab (index 0) is the Home tab. Other tabs include Contact, WiFi, Welcome, etc. I want to handle the remote's Menu / Back button (.onExitCommand) so that: If the user is on any tab other than Home (tabs 1, 2, 3, etc.), pressing the Menu button takes them back to the Home tab. If the user is already on the Home tab, then pressing the TV/Home button (not Menu) behaves as expected — suspending or exiting the app (handled by the system, no code involved). Here's a simplified version of what I implemented: .onExitCommand { if selectedTab != 0 { selectedTab = 0 focusedTab = 0 } else { // Let system handle the exit when user presses the TV/Home button } } This behavior ensures users don’t accidentally exit the app when they're browsing other tabs, and provides a consistent navigation experience. Question: Is this an acceptable and App Store-compliant use of .onExitCommand on tvOS? I'm not calling exit(0) or trying to force-terminate the app — just using .onExitCommand for in-app navigation purposes. Any official guidance or best practices would be greatly appreciated! Thanks, Prashant
Topic: UI Frameworks SubTopic: SwiftUI Tags:
0
0
113
May ’25
Tab bar inline icon text .compact mode in size classes in iPad in iOS 18..4.1
I am trying to do inline to icon and text in tab bar but it is not allowing me to do it in compact, but it showing me in regular mode , but in regular mode tab bar going at top in portrait mode , But my requirement is tab bar required in bottom with icon and text in inline it showed by horizontally but it showing to me stacked vertically, will you guide me on this so that I can push the build to live users.
0
0
144
May ’25
AVAudioSession dropping wired USBAudio source
My app inputs electrical waveforms from an IV485B39 2 channel USB device using an AVAudioSession. Before attempting to acquire data I make sure the input device is available as follows: AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; I have been using this code for about 10 years. My app is scriptable so a user can acquire data from the IV485B29 multiple times with various parameter settings (sampling rates and sample duration). Recently the scripts have been failing to complete and what I have notice that when it fails the list of available inputs is missing the USBAudio input. While debugging I have noticed that when working properly the list of inputs includes both the internal microphone as well as the USBAudio device as shown below. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584c7d0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>", "<AVAudioSessionPortDescription: 0x11584cae0, type = USBAudio; name = 485B39 200095708064650803073200616; UID = AppleUSBAudioEngine:Digiducer.com :485B39 200095708064650803073200616:000957 200095708064650803073200616:1; selectedDataSource = (null)>" ) But when it fails I only see the built in microphone. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584cef0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>" ) If I only see the built in microphone I immediately repeat the three lines of code and most of the "inputs" contains both the internal microphone and the USBAudioDevice AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; This fix always works on my M2 iPadPro and my iPhone 14 but some of my customers have older devices and even with 3 tries they still get faults about 1 in 10 tries. I rolled back my code to a released version from about 12 months ago where I know we never had this problem and compiled it against the current libraries and the problem still exists. I assume this is a problem caused by a change in the AVAudioSession framework libraries. I need to find a way to work around the issue or get the library fixed.
0
0
138
May ’25
How to get the date range of the data that is currently displayed in a Apple Chart?
I have a Swiftui app, and I'm using the Apple Chart framework to chart user transactions over time. I'd like to be able to show an annotation at the top of the chart that shows the date range of the records currently visible on the chart. Much like Apple does in their Heath App charts. But I just can't seem to find a method to read the current date range displayed on the chart once the user has scrolled though the chart. Has anyone done anything similar, or maybe seen some sample code? So far I'm striking out on this... Thanks in advance
1
0
237
May ’25
openURL:options:completionHandler: Not Opening tel:// Link on iPad with Cellular Data
We are using openURL:options:completionHandler: to open a tel:// number in the dialer to place a call. This works on iPhones and WiFi-only iPads (tested with a iPad Mini 6th Gen), but it is failing to open on an iPad 8th Gen (WiFi + Cellular) running iPadOS 18.5 being used by a customer. Prior to updating the iPad to iPadOS 18, the call worked on iPadOS 15.2 and opened the call in FaceTime as expected. Despite not opening the dialer in iPadOS 18, the completionHandler returns the success parameter as true. canOpenUrl also returns true. We created a small test application that reproduces the issue using the code snippet below in a new application, with the tel schema added to the info.plist Queried URL Schemes. We are currently using Xcode 16.3. Test Steps: Create a new blank application and replace ContentView.swift with the code snippet below Run the test app on a physical iPad 8th Gen (WiFi + Cellular) Tap the "place a test call" button Expected Results: The user is prompted to call the number and is taken to FaceTime to attempt the call. The user may then receive an alert telling them an iPhone must be paired if not already. Alternatively: return success = false in the completionHandler. Actual Results: No action occurs that is visible to the user, and the completionHandler returns success = true. Separately, we should be able to have some method of checking if the device can actually complete a call, i.e. if an iPhone is paired, so that we can correctly show or hide a phone icon in the app based on if the user can place a call. canOpenUrl returns true even if there is not a device paired and the call cannot actually be placed, and there doesn't seem to be a proper method for making that check. Code Snippet: import SwiftUI struct ContentView: View { @State private var showAlert = false var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") Button("Place a test call") { if let url = URL(string: "tel://5555554567") { UIApplication.shared.open(url) { success in if success { print("Call initiated successfully.") } else { showAlert = true } } } } } .padding() .alert("Call Failed", isPresented: $showAlert) { Button("OK") { showAlert = false } } message: { Text("The call could not be initiated.") } } } #Preview { ContentView() }
0
1
225
Jun ’25
How do I size a UITextView with scroll disabled?
tl;dr: UITextView does not auto layout when isScrollEnabled = false I have a screen with multiple UITextViews on it, contained within a ScrollView. For each textview, I calculate the height needed to display the entire content in SwiftUI and set it using the .frame(width:height:) modifier. The UITextView will respect the size passed in and layout within the container, but since UITextView is embedded within a UIScrollView, when a user attempts to scroll on the page, often they will scroll within a UITextView block rather than the page. They currently need to scroll along the margins outside of the textview to get the proper behavior. Since I am already calculating the height to display the text, I don't want the UITextView to scroll. However, when I set isScrollEnabled = false, the text view displays in a single long line that gets truncated. I have tried Setting various frame/size attributes but that seems to have zero affect on the layout. Embedding the textView within a UIView, and then sizing the container, but then the textView does not display at all. Setting a fixed size textContainer in the layoutManager but did not work. There's a lot of code so I can't copy/paste it all, but generally, it looks like struct SwiftUITextEditor: View { @State var text: AttributedString = "" var body: some View { ZStack { MyTextViewRepresentable(text: $text) } .dynamicallySized(from: $text) } } struct MyTextViewRepresentable: UIViewRepresentable { @Binding var text: AttributedString let textView = UITextView(usingTextLayoutManager: true) func makeUIView(context: Context) -> UITextView { textView.attributedText = text textView.isScrollEnabled = false } ... }
1
0
260
May ’25
SwiftUI internal crash when interacting with long list quickly
Hello! We encountered a very intermittent crash with our application starting with devices running iOS 18.4. We have a screen that can display a long list of products in 2 states (expanded or collapsed) based off of a boolean if the user has interacted with that product yet. With this list, we very intermittently encounter a crash when we scroll like crazy up and down the list search the list quickly (search is performed each character change and list is filtered) Our project has iOS 17.0 as a minimum deployment target, and is Swift 6 enabled. Again, this started happening only with iOS 18.4, and is still visible (handful of occurrences each week). The crash report seems to be very internal to SwiftUI/Obj-c runtime. 5895AC17-6886-4070-BC80-8912E8394BDB.crash Any insights would be greatly appreciated!
3
0
200
Jun ’25
CPTabBarTemplate in CarPlay Simulator: Tab Becomes Inactive on Re-selection
I am facing an issue in my CarPlay app using CPTabBarTemplate. The app has two tabs, and on launch, the first tab is correctly selected. However, when I tap on the first tab again, instead of staying active, it becomes inactive. This behavior is unexpected, as re-selecting the active tab should typically maintain its selected state. Has anyone else encountered this issue or found a workaround to prevent the tab from becoming inactive?
0
0
64
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
169
Jun ’25
Cannot configure contentShape for final preview of .contextMenu(menuItems: , preview: )
Without using a custom preview, you can set .contentShape(RoundedRectangle(cornerRadius: 30)) so that in the "zoomed in" preview of the contextMenu you can have a custom cornerRadius. However, this does not work if you create a custom preview, because then the ContentShape gets applied only to the LIFT PREVIEW, and not to the FINAL PREVIEW state. Heres a sample code - I'd love some support! :) import SwiftUI struct ContentView: View { var body: some View { VStack { Rectangle() .fill(Color.blue) .frame(width: 300, height: 300) .cornerRadius(30) .contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 30)) .contextMenu { Button("Hello") {} Button("Goofy") {} } preview: { Rectangle() .fill(Color.blue) .frame(width: 300, height: 300) .cornerRadius(30) //.contentShape(RoundedRectangle(cornerRadius: 30)) //.contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 30)) } Text("contextMenu item with large cornerRadius is not working as expected... No way to set contentShape to custom corner radius for final preview - not the lift preview") } } }
1
0
133
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
307
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
299
May ’25
TipKit
When using Tips.showAllTipsForTesting() my tips are shown repeatedly again and again after ~2 seconds on 18.4 and 18.5. It is not happening on iOS 18.1 (only tested with simulator) Is this intended? It makes debugging very difficult. Edit: Also, Tips.resetDatastore() does not seem to work as the documentation says?
Replies
2
Boosts
0
Views
233
Activity
May ’25
FamilyActivityTitleView Label has wrong text color when app is using different than system theme
Hello, In a new app I am working on I noticed the FamilyActivityTitleView that displays "ApplicationToken" has wrong (black) color when phone is set to light mode but app is using dark mode via override. We display user's selected apps and the labels are rendered correctly at first, but then when user updates selection with FamilyActivityPicker, then those newly added apps are rendered with black titles. The problem goes away when I close the screen and open it again. It also doesn't happen when phone is set to dark theme. I am currently noticing the issue on iOS 18.4.1. I have tried various workarounds like forcing white text in the custom label style, forcing re-render with custom .id value but nothing helped. Is there any way how to fix this?
Replies
0
Boosts
0
Views
153
Activity
May ’25
How to correctly set a Picker's selection and contents in SwiftUI for macOS?
How do you atomically set a Picker's selection and contents on macOS such that you don't end up in a situation where the selection is not present within the Picker's content? I presume Picker on macOS is implemented as an NSPopUpButton and an NSPopUpButton doesn't really like the concept of "no selection". SwiftUI, when presented with that, outputs: Picker: the selection "nil" is invalid and does not have an associated tag, this will give undefined results. Consider the following pseudo code: struct ParentView: View { @State private var items: [Item] var body: some View { ChildView(items: items) } } struct ChildView: View { let items: [Item] @State private var selectedItem: Item? var body: some View { Picker("", selection: $selectedItem) { ForEach(items) { item in Text(item.name).tag(item) } } } } When items gets passed down from ParentView to the ChildView, it's entirely possible that the current value in selectedItem represents an Item that is not longer in the items[] array. You can "catch" that by using .onAppear, .task, .onChange and maybe some other modifiers, but not until after at least one render pass has happened and an error has likely been reported because selectedItem is nil or it's not represented in the items[] array. Because selectedItem is private state, a value can't easily be passed down from the parent view, though even if it could that just kind of moves the problem one level higher up. What is the correct way to handle this type of data flow in SwiftUI for macOS?
Replies
1
Boosts
0
Views
215
Activity
May ’25
ssue with Session Sharing Between Safari and ASWebAuthenticationSession
We are experiencing an issue with session sharing on iOS and would appreciate your guidance. We operate and control our own OpenID Connect (OIDC) server. Our iOS application uses ASWebAuthenticationSession to authenticate users. We're unable to get the authentication session to be shared between the Safari app and the app's ASWebAuthenticationSession. This results in users having to re-authenticate despite being logged in via Safari. We've attempted various configurations related to cookie SameSite settings. These adjustments resolved the session sharing issue on Android using Chrome Custom Tabs. However, no changes we've tried have enabled session sharing to work as expected on iOS. According to documentation from Apple, Microsoft, Okta, and Auth0, session sharing between Safari and ASWebAuthenticationSession should work. Question: Are there any additional settings, configurations, or platform limitations we should be aware of that could impact session sharing on iOS? Where else can we look to resolve this issue?
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
142
Activity
May ’25
tvOS Remote Control Entitlements
I've been looking for a solution to configure the Apple TV remote(s) from the 5th generation and upwards. Some of the basic functionalities are disabling buttons on the physical remote control while maintaining proper functionality on remote controller apps on iOS devices. There seems to be a lack of relevant entitlements in that category, and without it I can't seem to figure out a way to make it work. Any ideas on the matter? Maybe a workaround that allows to configure the Apple TV to work with other remotes? Thank you in advance to anyone that put in thought to my query.
Replies
0
Boosts
0
Views
113
Activity
May ’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
264
Activity
May ’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
465
Activity
May ’25
Application crashes when using TextEditor(text, selection)
I have a TextEditor, to the constructor of which in addition to the text I pass an object of the TextSelection? type. I check on the Simulator with iOS 18.2. An attempt to clear the text leads to a crash with the message "Thread 1: Fatal error: String index is out of bounds" in Xcode. More about the error: libswiftCore.dylib`_swift_runtime_on_report: -> 0x194f32024 <+0>: ret More about the reproduction conditions: struct MyView: View { @Bindable private var viewModel = MyViewModel() @State var myTextSelection: TextSelection? = nil var body: some View { ZStack { // Some other code myEditor // Some other code } .toolbar { ToolbarItem(placement: .primaryAction) { Button { viewModel.clear() } label: { Label("Clear", systemImage: "eraser") } } } } var myEditor: some View { ZStack(alignment: .topLeading) { TextEditor(text: $viewModel.text, selection: $myTextSelection) .disableAutocorrection(true) .autocapitalization(.sentences) } // Some other code } } MyViewModel: @Observable final class MyViewModel: ObservableObject { var text: String = "" func clear() { text = "" } }
Replies
1
Boosts
0
Views
137
Activity
May ’25
tvOS: Using .onExitCommand to Navigate to Home Tab Before Exiting — Is This Acceptable?
Hi Apple Developer Team, In my tvOS app built with SwiftUI, I have a tab-based interface with several sections. The first tab (index 0) is the Home tab. Other tabs include Contact, WiFi, Welcome, etc. I want to handle the remote's Menu / Back button (.onExitCommand) so that: If the user is on any tab other than Home (tabs 1, 2, 3, etc.), pressing the Menu button takes them back to the Home tab. If the user is already on the Home tab, then pressing the TV/Home button (not Menu) behaves as expected — suspending or exiting the app (handled by the system, no code involved). Here's a simplified version of what I implemented: .onExitCommand { if selectedTab != 0 { selectedTab = 0 focusedTab = 0 } else { // Let system handle the exit when user presses the TV/Home button } } This behavior ensures users don’t accidentally exit the app when they're browsing other tabs, and provides a consistent navigation experience. Question: Is this an acceptable and App Store-compliant use of .onExitCommand on tvOS? I'm not calling exit(0) or trying to force-terminate the app — just using .onExitCommand for in-app navigation purposes. Any official guidance or best practices would be greatly appreciated! Thanks, Prashant
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
0
Boosts
0
Views
113
Activity
May ’25
Tab bar inline icon text .compact mode in size classes in iPad in iOS 18..4.1
I am trying to do inline to icon and text in tab bar but it is not allowing me to do it in compact, but it showing me in regular mode , but in regular mode tab bar going at top in portrait mode , But my requirement is tab bar required in bottom with icon and text in inline it showed by horizontally but it showing to me stacked vertically, will you guide me on this so that I can push the build to live users.
Replies
0
Boosts
0
Views
144
Activity
May ’25
AVAudioSession dropping wired USBAudio source
My app inputs electrical waveforms from an IV485B39 2 channel USB device using an AVAudioSession. Before attempting to acquire data I make sure the input device is available as follows: AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; I have been using this code for about 10 years. My app is scriptable so a user can acquire data from the IV485B29 multiple times with various parameter settings (sampling rates and sample duration). Recently the scripts have been failing to complete and what I have notice that when it fails the list of available inputs is missing the USBAudio input. While debugging I have noticed that when working properly the list of inputs includes both the internal microphone as well as the USBAudio device as shown below. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584c7d0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>", "<AVAudioSessionPortDescription: 0x11584cae0, type = USBAudio; name = 485B39 200095708064650803073200616; UID = AppleUSBAudioEngine:Digiducer.com :485B39 200095708064650803073200616:000957 200095708064650803073200616:1; selectedDataSource = (null)>" ) But when it fails I only see the built in microphone. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584cef0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>" ) If I only see the built in microphone I immediately repeat the three lines of code and most of the "inputs" contains both the internal microphone and the USBAudioDevice AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; This fix always works on my M2 iPadPro and my iPhone 14 but some of my customers have older devices and even with 3 tries they still get faults about 1 in 10 tries. I rolled back my code to a released version from about 12 months ago where I know we never had this problem and compiled it against the current libraries and the problem still exists. I assume this is a problem caused by a change in the AVAudioSession framework libraries. I need to find a way to work around the issue or get the library fixed.
Replies
0
Boosts
0
Views
138
Activity
May ’25
How to get the date range of the data that is currently displayed in a Apple Chart?
I have a Swiftui app, and I'm using the Apple Chart framework to chart user transactions over time. I'd like to be able to show an annotation at the top of the chart that shows the date range of the records currently visible on the chart. Much like Apple does in their Heath App charts. But I just can't seem to find a method to read the current date range displayed on the chart once the user has scrolled though the chart. Has anyone done anything similar, or maybe seen some sample code? So far I'm striking out on this... Thanks in advance
Replies
1
Boosts
0
Views
237
Activity
May ’25
openURL:options:completionHandler: Not Opening tel:// Link on iPad with Cellular Data
We are using openURL:options:completionHandler: to open a tel:// number in the dialer to place a call. This works on iPhones and WiFi-only iPads (tested with a iPad Mini 6th Gen), but it is failing to open on an iPad 8th Gen (WiFi + Cellular) running iPadOS 18.5 being used by a customer. Prior to updating the iPad to iPadOS 18, the call worked on iPadOS 15.2 and opened the call in FaceTime as expected. Despite not opening the dialer in iPadOS 18, the completionHandler returns the success parameter as true. canOpenUrl also returns true. We created a small test application that reproduces the issue using the code snippet below in a new application, with the tel schema added to the info.plist Queried URL Schemes. We are currently using Xcode 16.3. Test Steps: Create a new blank application and replace ContentView.swift with the code snippet below Run the test app on a physical iPad 8th Gen (WiFi + Cellular) Tap the "place a test call" button Expected Results: The user is prompted to call the number and is taken to FaceTime to attempt the call. The user may then receive an alert telling them an iPhone must be paired if not already. Alternatively: return success = false in the completionHandler. Actual Results: No action occurs that is visible to the user, and the completionHandler returns success = true. Separately, we should be able to have some method of checking if the device can actually complete a call, i.e. if an iPhone is paired, so that we can correctly show or hide a phone icon in the app based on if the user can place a call. canOpenUrl returns true even if there is not a device paired and the call cannot actually be placed, and there doesn't seem to be a proper method for making that check. Code Snippet: import SwiftUI struct ContentView: View { @State private var showAlert = false var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") Button("Place a test call") { if let url = URL(string: "tel://5555554567") { UIApplication.shared.open(url) { success in if success { print("Call initiated successfully.") } else { showAlert = true } } } } } .padding() .alert("Call Failed", isPresented: $showAlert) { Button("OK") { showAlert = false } } message: { Text("The call could not be initiated.") } } } #Preview { ContentView() }
Replies
0
Boosts
1
Views
225
Activity
Jun ’25
How do I size a UITextView with scroll disabled?
tl;dr: UITextView does not auto layout when isScrollEnabled = false I have a screen with multiple UITextViews on it, contained within a ScrollView. For each textview, I calculate the height needed to display the entire content in SwiftUI and set it using the .frame(width:height:) modifier. The UITextView will respect the size passed in and layout within the container, but since UITextView is embedded within a UIScrollView, when a user attempts to scroll on the page, often they will scroll within a UITextView block rather than the page. They currently need to scroll along the margins outside of the textview to get the proper behavior. Since I am already calculating the height to display the text, I don't want the UITextView to scroll. However, when I set isScrollEnabled = false, the text view displays in a single long line that gets truncated. I have tried Setting various frame/size attributes but that seems to have zero affect on the layout. Embedding the textView within a UIView, and then sizing the container, but then the textView does not display at all. Setting a fixed size textContainer in the layoutManager but did not work. There's a lot of code so I can't copy/paste it all, but generally, it looks like struct SwiftUITextEditor: View { @State var text: AttributedString = "" var body: some View { ZStack { MyTextViewRepresentable(text: $text) } .dynamicallySized(from: $text) } } struct MyTextViewRepresentable: UIViewRepresentable { @Binding var text: AttributedString let textView = UITextView(usingTextLayoutManager: true) func makeUIView(context: Context) -> UITextView { textView.attributedText = text textView.isScrollEnabled = false } ... }
Replies
1
Boosts
0
Views
260
Activity
May ’25
SwiftUI internal crash when interacting with long list quickly
Hello! We encountered a very intermittent crash with our application starting with devices running iOS 18.4. We have a screen that can display a long list of products in 2 states (expanded or collapsed) based off of a boolean if the user has interacted with that product yet. With this list, we very intermittently encounter a crash when we scroll like crazy up and down the list search the list quickly (search is performed each character change and list is filtered) Our project has iOS 17.0 as a minimum deployment target, and is Swift 6 enabled. Again, this started happening only with iOS 18.4, and is still visible (handful of occurrences each week). The crash report seems to be very internal to SwiftUI/Obj-c runtime. 5895AC17-6886-4070-BC80-8912E8394BDB.crash Any insights would be greatly appreciated!
Replies
3
Boosts
0
Views
200
Activity
Jun ’25
CPTabBarTemplate in CarPlay Simulator: Tab Becomes Inactive on Re-selection
I am facing an issue in my CarPlay app using CPTabBarTemplate. The app has two tabs, and on launch, the first tab is correctly selected. However, when I tap on the first tab again, instead of staying active, it becomes inactive. This behavior is unexpected, as re-selecting the active tab should typically maintain its selected state. Has anyone else encountered this issue or found a workaround to prevent the tab from becoming inactive?
Replies
0
Boosts
0
Views
64
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
169
Activity
Jun ’25
Cannot configure contentShape for final preview of .contextMenu(menuItems: , preview: )
Without using a custom preview, you can set .contentShape(RoundedRectangle(cornerRadius: 30)) so that in the "zoomed in" preview of the contextMenu you can have a custom cornerRadius. However, this does not work if you create a custom preview, because then the ContentShape gets applied only to the LIFT PREVIEW, and not to the FINAL PREVIEW state. Heres a sample code - I'd love some support! :) import SwiftUI struct ContentView: View { var body: some View { VStack { Rectangle() .fill(Color.blue) .frame(width: 300, height: 300) .cornerRadius(30) .contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 30)) .contextMenu { Button("Hello") {} Button("Goofy") {} } preview: { Rectangle() .fill(Color.blue) .frame(width: 300, height: 300) .cornerRadius(30) //.contentShape(RoundedRectangle(cornerRadius: 30)) //.contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 30)) } Text("contextMenu item with large cornerRadius is not working as expected... No way to set contentShape to custom corner radius for final preview - not the lift preview") } } }
Replies
1
Boosts
0
Views
133
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
307
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
299
Activity
May ’25