Provide views, controls, and layout structures for declaring your app's user interface using SwiftUI.

SwiftUI Documentation

Posts under SwiftUI subtopic

Post

Replies

Boosts

Views

Activity

Credit Card Autofill Not Working in React Native TextInput
Hello, I'm currently investigating an issue related to iOS credit card autofill (Payments & Card Details) in our mobile application. Our app is built using React Native, and we are implementing card input fields using TextInput with the required autofill configuration: autoComplete="cc-number" textContentType="creditCardNumber" Despite correctly configuring these properties, credit card autofill is not being triggered on iOS devices. I would appreciate clarification on: Is credit card autofill officially supported for React Native TextInput fields using autoComplete="cc-number" and textContentType="creditCardNumber"? Are there any additional requirements (entitlements, associated domains, specific configurations, etc.) needed for payment autofill to work? Is autofill expected to work inside WKWebView contexts? Are there any known limitations or restrictions for third-party frameworks such as React Native? I would appreciate any guidance or documentation you can share regarding the expected behavior and official support for this scenario
0
0
64
Mar ’26
How do you make a resizable segmented control in SwiftUI for macOS?
In SwiftUI for macOS, how do I configure a Picker as a segmented control to have a flexible width? This design pattern is present in Xcode 26 at the top of the sidebar and inspector panel. I can't figure out the combination of view modifiers to achieve a similar look. import SwiftUI struct ContentView: View { @State private var selection = 0 var body: some View { VStack { Picker("", selection: $selection) { Image(systemName: "doc") Image(systemName: "folder") Image(systemName: "gear") Image(systemName: "globe") .frame(maxWidth: .infinity) // Doesn't do anything. } .labelsHidden() .pickerStyle(.segmented) .frame(maxWidth: .infinity) // Doesn't affect segment sizes. Spacer() } } } I want the entire Picker to fill the width and for each segment to be of equal widths. How? In AppKit I would use AutoLayout for the flexible width and NSSegmentedControl.segmentDistribution for the segment widths. Is there a SwiftUI equivalent? macOS 26 / Xcode 26.3
Topic: UI Frameworks SubTopic: SwiftUI Tags:
0
0
97
Mar ’26
SwiftData with shared and private containers
I was hoping for an update of SwiftData which adopted the use of shared and public CloudKit containers, in the same way it does for the private CloudKit container. So firstly, a big request to any Apple devs reading, for this to be a thing! Secondly, what would be a sensible way of adding a shared container in CloudKit to an existing app that is already using SwiftData? Would it be possible to use the new DataStore method to manage CloudKit syncing with a public or shared container?
12
18
4.0k
Mar ’26
Detect closing of tab (NSWindowTab) in WindowGroup
I have a SwiftUI app displaying tabbed windows (as NSWindowTab) in a WindowGroup: import SwiftUI @main struct TabTestApp: App { var body: some Scene { WindowGroup{ ContentView() // Hasn't any content of relevance to this question. }.commands{ CommandGroup(after: .newItem) { Button("New Tab") { guard let currentWindow = NSApp.keyWindow, let windowController = currentWindow.windowController else { return } windowController.newWindowForTab(nil) guard let newWindow = NSApp.keyWindow else { return } if currentWindow != newWindow { currentWindow.addTabbedWindow(newWindow, ordered: .above) } }.keyboardShortcut(.init("t", modifiers: [.command])) } } } } Is there a way to detect the closing of one or multiple tabs, e.g. when the user clicks on the tab bar's "Close Other Tabs" option or pushes CMD + W in order to ask the user whether he or she wants to save changes? What I've tried to no avail: Intercept windowWillClose👉Won't be called if a single tab within a window is closed (but only once the last tab of a window is closed). Handling onDissapear()👉Doesn't work since the closing cannot be cancelled. Using DocumentGroup 👉Doesn't work since the app in question isn't about documents (i.e., files which are stored externally), but about data that's stored in a database. Many thanks! Related threads: Preserve all tabs of last window on close. (Like Finder) Detect Close Window vs Close Tab
0
0
76
Mar ’26
fullScreenCover & Sheet modifier lifecycles
Hello everyone, I’m running into an issue where a partial sheet repeatedly presents and dismisses in a loop. Setup The main screen is presented using fullScreenCover From that screen, a button triggers a standard partial-height sheet The sheet is presented using .sheet(item:) Expected Behavior Tapping the button should present the sheet once and allow it to be dismissed normally. Actual Behavior After the sheet is triggered, it continuously presents and dismisses. What I’ve Verified The bound item is not being reassigned in either the parent or the presented view There is no .task, .onAppear, or .onChange that sets the item again The loop appears to happen without any explicit state updates Additional Context I encountered a very similar issue when iOS 26.0 was first released At that time, moving the .sheet modifier to a higher parent level resolved the issue The problem has now returned on iOS 26.4 beta I’m currently unable to reproduce this in a minimal sample project, which makes it unclear whether: this is a framework regression, or I’m missing a new presentation requirement Environment iOS: 26.4 beta Xcode: 26.4 beta I’ve attached a screen recording of the behavior. Has anyone else experienced this with a fullScreenCover → sheet flow on iOS 26.4? Any guidance or confirmation would be greatly appreciated. Thank you!
1
0
134
Feb ’26
"Searchable with .toolbarPrincipal incorrectly places search field at bottom instead of navigation bar"
When using .searchable with placement: .toolbarPrincipal inside a NavigationStack, the search field is incorrectly placed at the bottom of the view instead of the principal position where ToolbarPlacement.principal normally resides. This is confirmed by testing: a ToolbarItem with placement: .principal containing Text("Title") gets pushed away when the .searchable modifier is added, yet the search field still appears at the bottom rather than taking over the principal location as documented.
0
0
51
Feb ’26
What is the state of EventKit going forward?
I'm building an app that heavily relies on EKEventStore for calendar and reminder integration. The API is simple - and limited. Change notifications amount to "something changed, you'd better refetch everything you care about." There's no way to know whether the calendar was updated while your app was closed or backgrounded. EKEvents and EKReminders don't trigger SwiftUI view updates, so you end up shunting them into your own observable state and keeping the two in sync. My app is fairly complex rendering-wise, and I lament being locked into treating EKEventStore as a first-class citizen of my view and data layer. It makes everything clunkier, essentially shuts the door on modern features like undo/redo, and makes integrating with other calendar providers that much harder. I'm exploring a custom SwiftData DataStore ↔ EKEventStore sync engine, but this is no easy task. There are still many unknowns I'd need to spike out before I can even attempt a proper implementation. Still, I'm curious - is this something being actively worked on behind the scenes? Will we see a more modern, observable, SwiftUI-native EventKit integration in the future?
1
0
71
Feb ’26
Query with predicate in child view running too frequently.
I'm trying to determine if this is "expected" swiftui behavior or an issue with SwiftUI/Data which needs a feedback request... When a child view has a Query containing a filter predicate, the query is run with each and every edit of the parent view, even when the edit has no impact on the child view (e.g. bindings not changing). In the example below, ContentView has the TextField name, and while data is being entered in it, causes the Query in AddTestStageView to be run with each character typed, e.g. 30 characters result in 30 query executions. (Need "-com.apple.CoreData.SQLDebug 1" launch argument to see SQL output). Removing the filter predicate from the query and filtering in ForEach prevents the issue. In my actual use case, the query has a relatively small result set (<100 rows), but I can see this as a performance issue with the larger result sets. xcode/ios: 26.2 Repro example code: import SwiftUI import SwiftData // Repro to Query filter issue in child view running multiple time unexpectedly // Need "-com.apple.CoreData.SQLDebug 1" launch argument set to see SQL console output. @main struct ReproViewQueryMultipleRunningsApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer(DataManager.shared.sharedModelContainer()) } } @Model final class TestStageClass { var id: UUID = UUID() var name: String = "" var isActive: Bool = true var displayOrder: Int = 0 init(name: String, isActive: Bool, displayOrder: Int) { self.name = name self.isActive = isActive self.displayOrder = displayOrder } } struct ContentView: View { @Environment(\.modelContext) var modelContext @State private var name: String = "" @State private var selectedTestStage: TestStageClass = DataManager.shared.getFirstTestStageClass() var body: some View { VStack (spacing: 20) { TextField("Name", text: $name) AddTestStageView(selectedTestStage: $selectedTestStage) } .frame(height: 200) } } #Preview("Sample Data") { ContentView() .modelContainer(DataManager.shared.sharedModelContainer()) } struct AddTestStageView: View { @Environment(\.modelContext) var modelContext @Binding var selectedTestStage: TestStageClass // MARK: - ISSUE LOCATION /// Using this Query with filter causes it to be run after each editing on parent view - such as each letter when editing a name. @Query(filter: #Predicate<TestStageClass> { $0.isActive }) private var testStageClasses: [TestStageClass] /// Using this query doesn't have the issue, then need filter in ForEach. // @Query() private var testStageClasses: [TestStageClass] var body: some View { Picker("stage", selection: $selectedTestStage) { // filter and sort here does not affect issue with above Query predicate filter. ForEach(testStageClasses.filter(\.isActive).sorted(by: { $0.displayOrder < $1.displayOrder } ), id: \.id) { stage in Text("\(stage.name)") .tag(stage) } } } } class DataManager { static let shared = DataManager() private var modelContainer: ModelContainer? = nil public func sharedModelContainer(inMemory: Bool = false) -> ModelContainer { let schema = Schema([TestStageClass.self]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: inMemory) do { self.modelContainer = try ModelContainer(for: schema, configurations: [modelConfiguration]) checkDataExists() return self.modelContainer! } catch { fatalError("Could not create sharedModelContainer. Schema:\(schema.entities.map(\.name)), \((modelConfiguration.isStoredInMemoryOnly) ? "in memory only" : "in disk"):\n\(error.localizedDescription)") } } private func checkDataExists() { let mainContext = self.modelContainer!.mainContext print("checkDataExists") do { let classData: [TestStageClass] = try mainContext.fetch(FetchDescriptor<TestStageClass>()) if classData.isEmpty { mainContext.insert(TestStageClass(name: "Beginning", isActive: true, displayOrder: 0)) mainContext.insert(TestStageClass(name: "Second Middle", isActive: false, displayOrder: 2)) mainContext.insert(TestStageClass(name: "Middle", isActive: true, displayOrder: 1)) mainContext.insert(TestStageClass(name: "End", isActive: true, displayOrder: 3)) } if mainContext.hasChanges { try? mainContext.save() print("Added Default Data for TestStageClass") } } catch { fatalError("Failed to get item count for TestStageClass: \(error.localizedDescription)") } } func getFirstTestStageClass() -> TestStageClass { let mainContext = self.modelContainer!.mainContext var tmp: TestStageClass? do { let classData: [TestStageClass] = try mainContext.fetch(FetchDescriptor<TestStageClass>()) tmp = classData.sorted(by: {$0.displayOrder < $1.displayOrder }).first } catch { fatalError("getFirstTestStageClass: \(error.localizedDescription)") } return tmp! } } Thanks, Steve
1
0
83
Feb ’26
"NavigationLink in List incorrectly highlights when destination value exists in NavigationStack path"
In SwiftUI, when using NavigationStack with a path binding containing multiple instances of the same (or many with navigationPath()) model type (since model type are class type, this issue might occur on instances of class type too), any NavigationLink in a detail view that leads to a value already present anywhere in the navigation stack (which is in the path binding) will appear incorrectly highlighted upon the view's initial appearance. This bug seems manifests specifically when the links are contained within a List. The highlighting is inconsistent - only the earliest appended value in path has link in each section displays as pressed, while links to other value appear normal. Below is a simple code to reproduce the bug. import SwiftUI import SwiftData // Simple model @available(iOS 17, *) @Model class Item { var id = UUID() var name: String var relatedItems: [Item] init(name: String = "", relatedItems: [Item] = []) { self.name = name self.relatedItems = relatedItems } } // MARK: - Bug Reproducer @available(iOS 17, *) struct BugReproducerView: View { @State private var path: [Item] = [] let items: [Item] init() { let item1 = Item(name: "Item 1", relatedItems: []) let item2 = Item(name: "Item 2", relatedItems: [item1]) item1.relatedItems = [item2] self.items = [item1, item2] } var body: some View { NavigationStack(path: $path) { List(items) { item in NavigationLink(item.name, value: item) } .navigationTitle("Items") .navigationDestination(for: Item.self) { item in DetailView(item: item) } } } } // MARK: - Detail View with Bug @available(iOS 17, *) struct DetailView: View { let item: Item var body: some View { List { Section("Info") { Text("Selected: \(item.name)") } if !item.relatedItems.isEmpty { Section("Related") { ForEach(item.relatedItems) { related in NavigationLink(related.name, value: related) } } } } .navigationTitle(item.name) } } #Preview { if #available(iOS 17, *) { BugReproducerView() } else { } }
0
0
55
Feb ’26
TimelineView using ExplicitTimelineSchedule ignores last date?
Hi, everyone. I'm trying my first TimelineView with an explicit schedule, but my attempt – and even the simple example from the documentation – doesn't seem to work as documented. Here's what the documentation says an explicit schedule does: The timeline view updates its content on exactly the dates that you specify, until it runs out of dates, after which it stops changing. And it gives this example: let dates = [ Date(timeIntervalSinceNow: 10), // Update ten seconds from now, Date(timeIntervalSinceNow: 12), // and a few seconds later. ] struct MyView: View { var body: some View { TimelineView(.explicit(dates)) { context in Text(context.date.description) } } } There are stipulations about what the view – which always displays some version of its content body – will do given only past or future dates, but it seems clear we should expect the view in this example to redraw at least once after it appears. Here's the rest of the discussion from the documentation with my comments after testing what's stated: If the dates you provide are in the past, the timeline view updates exactly once with the last entry. That seems true, considering the "update" to be the initial draw. If you only provide dates in the future, the timeline view renders with the current date until the first date arrives. Not exactly: it looks the "date" property of the initial render is the (future) date of the first schedule entry, even though it's drawn early. When the first date does arrive, the body closure doesn't seem to be called. Only on the next date, if there is one, is it called again. If you provide one or more dates in the past and one or more in the future, the view renders the most recent past date, refreshing normally on all subsequent dates. That also seems correct, except… … that in every scenario, the final date entry seems to be ignored completely! In other words, unless all date entries are in the past, the Timeline View stops before it runs out of dates. That documented example from the start, which we expect to redraw at least once after it appears? When I test it in a Playground, it appears, but doesn't redraw at all! So, that's my main point of confusion after experimenting with TimelineView for the first time. I can achieve my own goal by appending an extra entry to my explicit schedule – even appending an entry identical to the previous "final" entry seems to work – but naturally that leaves me unclear about why I need to. If anyone can tell me what I'm not understanding, I'd be grateful.
4
2
857
Feb ’26
SwiftUI Link view corrupts destination URLs when using a leading-zero padded IPv4 address.
There appears to be a bug in Link with IPv4 addresses with padding in the second octet, on macOS and iOS both. struct LinkViewBug: View { let works = URL(string: "http://172.16.1.1")! let alsoWorks = URL(string: "http://172.16.001.001")! let doesntWork = URL(string: "http://172.016.001.001")! let alsoDoesntWork = URL(string: "http://172.016.1.1")! var body: some View { // destination -> http://172.16.1.1 Link(works.formatted(), destination: works) Link(alsoWorks.formatted(), destination: alsoWorks) // destination -> http://172.14.1.1 ? Link(doesntWork.formatted(), destination: doesntWork) Link(alsoDoesntWork.formatted(), destination: alsoDoesntWork) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
0
0
75
Feb ’26
In SwiftUI for macOS, is there an equivalent to NSControl.BorderShape?
In macOS 26, there is a new property on NSControl called .borderShape. The WWDC 2025-310 video says it can be used to "Override preferred shape of control to suit your design." and that it's available on NSButton, NSPopUpButton and NSSegmentedControl. Is there an equivalent to that property for SwiftUI? For example, given the following SwiftUI code: Button("Eject") { } .borderShape(...) <-- ? How can I apply a .borderShape that would match those on controls created in AppKit? I'm aware that SwiftUI offers a plethora of ways to custom design a button such that it can have rounded corners, but I'm interested in this particular property so that SwiftUI buttons and AppKit buttons in the same app have the same look-and-feel.
1
0
97
Feb ’26
Do SwiftUI Segmented Controls on macOS 26 support the icon and title label style?
On macOS 26.3, Xcode 26.3, why does a labelStyle of titleAndIcon not show both the title and the icon of a label? The label styles iconOnly and titleOnly behave as expected. Picker("Label Demo", selection: $selectedItem) { Label { Text("File") } icon: { Image(systemName: "doc") } Label { Text("Folder") } icon: { Image(systemName: "folder") } } .labelStyle(.titleAndIcon) .pickerStyle(.segmented) Note that there is no icon shown. Placing the .labelStyle modifier in different places has no effect. The icon is correctly shown when the labelStyle is set to .iconOnly. An NSSegmentedControl created with AppKit and presented in an NSViewRepresentable does correctly show titles and icons if configured appropriately. Tested on: macOS 26.3 (25D125) Xcode 26.3 (17C519) A brand new SwiftUI "macOS App" project.
2
0
95
Feb ’26
CarPlay: Can third-party audio apps add a Search/Siri button next to the Now Playing button like Apple Music?
Hi, In Apple Music on CarPlay, there is a Search button shown next to the Now Playing (NPS) button in the top navigation bar. Tapping this Search button activates Siri voice search. I want to understand: Does CarPlay allow third-party audio apps to add a similar Search button in the top bar (next to the Now Playing button)? Which can be used to trigger Siri from the screen UI (not steering-wheel button or “Hey Siri”)? Is there any supported approach for screen-based Siri activation other than the guidance here: https://developer.apple.com/documentation/carplay/cplisttemplate#Integrating-Siri-Into-Your-Template-App Basically, is the Apple Music search/Siri button a publicly available CarPlay capability, or is it system-reserved?
0
0
68
Feb ’26
How to delete a row from a table
To display rows and columns of data in a nice layout like a spreadsheet I use a table like the code here .. Table(array) { TableColumn("Ticker", value: \\.ticker) TableColumn("Other", value: \.other) } To delete a row from the table the advice is to use a ForEach loop. Since I don’t use a ForEach loop, how do I delete rows from the table ? With this code there is no way to attach a .onDelete modifier or a Button Any advice would be much appreciated Thank you
Topic: UI Frameworks SubTopic: SwiftUI
1
0
58
Feb ’26
Does anyone know how to prevent Liqud Glass from stretching when elements with the glassEffect are dragged?
When making an element with .glassEffect(.clear.interactive()) draggable, it stretches as it moves. It seems like it's meant to stretch as you move your finger away from the element, but it doesn't make sense if the element is following your finger as you drag it. Is this a bug, or is there a way to disable this behavior without removing the other "interactive" animations? P.S. The shiny border around the elements seems to be a rounded rectangle or capsule, but the actual element's shape seems to be stretched. That also appears to be a bug.
0
0
93
Feb ’26
iOS 26.3: Memory crash with @AppStorage and view transitions
I'm experiencing consistent memory crashes in iOS 26.3 (23D127) when using @AppStorage with view transitions. Environment: Device: iPhone 17 Pro Max iOS: 26.3 (23D127) Xcode: 26.2 (17C52) Issue: App crashes with "Terminated due to memory issue" when: Using @AppStorage to manage state Calling UserDefaults.set() in completion handler Transitioning to new view based on changed state Workaround: Using @State instead of @AppStorage prevents crash. Feedback: FB############ (your number) Has anyone else experienced this? Is this a known issue in iOS 26?
Topic: UI Frameworks SubTopic: SwiftUI
0
0
57
Feb ’26
.navigationDestination(isPresented hangs after reboot in watchOS when destination view contains @Environment(\.dismiss)
.navigationDestination(isPresented) hangs after reboot (when called within 2 minutes of reboot) in watchOS when destination view contains @Environment(.dismiss). Feedback: FB21077151 Second button hangs after reboot. Hangs in watchOS 26.0 and 26.4 on a physical device. struct ContentView: View { @State var presentView1 : Bool = false @State var presentView2 : Bool = false var body: some View { NavigationStack { VStack { Button("Show View 1") { presentView1.toggle() } Button("Show View 2") { presentView2.toggle() } } .navigationDestination(isPresented: $presentView1, destination: {TestView1()}) .navigationDestination(isPresented: $presentView2, destination: {TestView2()}) } } } struct TestView1: View { var body: some View { Text("View 1") } } struct TestView2: View { @Environment(\.dismiss) var dismiss var body: some View { Text("View 2") } }
2
0
107
Feb ’26
Credit Card Autofill Not Working in React Native TextInput
Hello, I'm currently investigating an issue related to iOS credit card autofill (Payments & Card Details) in our mobile application. Our app is built using React Native, and we are implementing card input fields using TextInput with the required autofill configuration: autoComplete="cc-number" textContentType="creditCardNumber" Despite correctly configuring these properties, credit card autofill is not being triggered on iOS devices. I would appreciate clarification on: Is credit card autofill officially supported for React Native TextInput fields using autoComplete="cc-number" and textContentType="creditCardNumber"? Are there any additional requirements (entitlements, associated domains, specific configurations, etc.) needed for payment autofill to work? Is autofill expected to work inside WKWebView contexts? Are there any known limitations or restrictions for third-party frameworks such as React Native? I would appreciate any guidance or documentation you can share regarding the expected behavior and official support for this scenario
Replies
0
Boosts
0
Views
64
Activity
Mar ’26
How do you make a resizable segmented control in SwiftUI for macOS?
In SwiftUI for macOS, how do I configure a Picker as a segmented control to have a flexible width? This design pattern is present in Xcode 26 at the top of the sidebar and inspector panel. I can't figure out the combination of view modifiers to achieve a similar look. import SwiftUI struct ContentView: View { @State private var selection = 0 var body: some View { VStack { Picker("", selection: $selection) { Image(systemName: "doc") Image(systemName: "folder") Image(systemName: "gear") Image(systemName: "globe") .frame(maxWidth: .infinity) // Doesn't do anything. } .labelsHidden() .pickerStyle(.segmented) .frame(maxWidth: .infinity) // Doesn't affect segment sizes. Spacer() } } } I want the entire Picker to fill the width and for each segment to be of equal widths. How? In AppKit I would use AutoLayout for the flexible width and NSSegmentedControl.segmentDistribution for the segment widths. Is there a SwiftUI equivalent? macOS 26 / Xcode 26.3
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
0
Boosts
0
Views
97
Activity
Mar ’26
SwiftData with shared and private containers
I was hoping for an update of SwiftData which adopted the use of shared and public CloudKit containers, in the same way it does for the private CloudKit container. So firstly, a big request to any Apple devs reading, for this to be a thing! Secondly, what would be a sensible way of adding a shared container in CloudKit to an existing app that is already using SwiftData? Would it be possible to use the new DataStore method to manage CloudKit syncing with a public or shared container?
Replies
12
Boosts
18
Views
4.0k
Activity
Mar ’26
Detect closing of tab (NSWindowTab) in WindowGroup
I have a SwiftUI app displaying tabbed windows (as NSWindowTab) in a WindowGroup: import SwiftUI @main struct TabTestApp: App { var body: some Scene { WindowGroup{ ContentView() // Hasn't any content of relevance to this question. }.commands{ CommandGroup(after: .newItem) { Button("New Tab") { guard let currentWindow = NSApp.keyWindow, let windowController = currentWindow.windowController else { return } windowController.newWindowForTab(nil) guard let newWindow = NSApp.keyWindow else { return } if currentWindow != newWindow { currentWindow.addTabbedWindow(newWindow, ordered: .above) } }.keyboardShortcut(.init("t", modifiers: [.command])) } } } } Is there a way to detect the closing of one or multiple tabs, e.g. when the user clicks on the tab bar's "Close Other Tabs" option or pushes CMD + W in order to ask the user whether he or she wants to save changes? What I've tried to no avail: Intercept windowWillClose👉Won't be called if a single tab within a window is closed (but only once the last tab of a window is closed). Handling onDissapear()👉Doesn't work since the closing cannot be cancelled. Using DocumentGroup 👉Doesn't work since the app in question isn't about documents (i.e., files which are stored externally), but about data that's stored in a database. Many thanks! Related threads: Preserve all tabs of last window on close. (Like Finder) Detect Close Window vs Close Tab
Replies
0
Boosts
0
Views
76
Activity
Mar ’26
fullScreenCover & Sheet modifier lifecycles
Hello everyone, I’m running into an issue where a partial sheet repeatedly presents and dismisses in a loop. Setup The main screen is presented using fullScreenCover From that screen, a button triggers a standard partial-height sheet The sheet is presented using .sheet(item:) Expected Behavior Tapping the button should present the sheet once and allow it to be dismissed normally. Actual Behavior After the sheet is triggered, it continuously presents and dismisses. What I’ve Verified The bound item is not being reassigned in either the parent or the presented view There is no .task, .onAppear, or .onChange that sets the item again The loop appears to happen without any explicit state updates Additional Context I encountered a very similar issue when iOS 26.0 was first released At that time, moving the .sheet modifier to a higher parent level resolved the issue The problem has now returned on iOS 26.4 beta I’m currently unable to reproduce this in a minimal sample project, which makes it unclear whether: this is a framework regression, or I’m missing a new presentation requirement Environment iOS: 26.4 beta Xcode: 26.4 beta I’ve attached a screen recording of the behavior. Has anyone else experienced this with a fullScreenCover → sheet flow on iOS 26.4? Any guidance or confirmation would be greatly appreciated. Thank you!
Replies
1
Boosts
0
Views
134
Activity
Feb ’26
"Searchable with .toolbarPrincipal incorrectly places search field at bottom instead of navigation bar"
When using .searchable with placement: .toolbarPrincipal inside a NavigationStack, the search field is incorrectly placed at the bottom of the view instead of the principal position where ToolbarPlacement.principal normally resides. This is confirmed by testing: a ToolbarItem with placement: .principal containing Text("Title") gets pushed away when the .searchable modifier is added, yet the search field still appears at the bottom rather than taking over the principal location as documented.
Replies
0
Boosts
0
Views
51
Activity
Feb ’26
What is the state of EventKit going forward?
I'm building an app that heavily relies on EKEventStore for calendar and reminder integration. The API is simple - and limited. Change notifications amount to "something changed, you'd better refetch everything you care about." There's no way to know whether the calendar was updated while your app was closed or backgrounded. EKEvents and EKReminders don't trigger SwiftUI view updates, so you end up shunting them into your own observable state and keeping the two in sync. My app is fairly complex rendering-wise, and I lament being locked into treating EKEventStore as a first-class citizen of my view and data layer. It makes everything clunkier, essentially shuts the door on modern features like undo/redo, and makes integrating with other calendar providers that much harder. I'm exploring a custom SwiftData DataStore ↔ EKEventStore sync engine, but this is no easy task. There are still many unknowns I'd need to spike out before I can even attempt a proper implementation. Still, I'm curious - is this something being actively worked on behind the scenes? Will we see a more modern, observable, SwiftUI-native EventKit integration in the future?
Replies
1
Boosts
0
Views
71
Activity
Feb ’26
Query with predicate in child view running too frequently.
I'm trying to determine if this is "expected" swiftui behavior or an issue with SwiftUI/Data which needs a feedback request... When a child view has a Query containing a filter predicate, the query is run with each and every edit of the parent view, even when the edit has no impact on the child view (e.g. bindings not changing). In the example below, ContentView has the TextField name, and while data is being entered in it, causes the Query in AddTestStageView to be run with each character typed, e.g. 30 characters result in 30 query executions. (Need "-com.apple.CoreData.SQLDebug 1" launch argument to see SQL output). Removing the filter predicate from the query and filtering in ForEach prevents the issue. In my actual use case, the query has a relatively small result set (<100 rows), but I can see this as a performance issue with the larger result sets. xcode/ios: 26.2 Repro example code: import SwiftUI import SwiftData // Repro to Query filter issue in child view running multiple time unexpectedly // Need "-com.apple.CoreData.SQLDebug 1" launch argument set to see SQL console output. @main struct ReproViewQueryMultipleRunningsApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer(DataManager.shared.sharedModelContainer()) } } @Model final class TestStageClass { var id: UUID = UUID() var name: String = "" var isActive: Bool = true var displayOrder: Int = 0 init(name: String, isActive: Bool, displayOrder: Int) { self.name = name self.isActive = isActive self.displayOrder = displayOrder } } struct ContentView: View { @Environment(\.modelContext) var modelContext @State private var name: String = "" @State private var selectedTestStage: TestStageClass = DataManager.shared.getFirstTestStageClass() var body: some View { VStack (spacing: 20) { TextField("Name", text: $name) AddTestStageView(selectedTestStage: $selectedTestStage) } .frame(height: 200) } } #Preview("Sample Data") { ContentView() .modelContainer(DataManager.shared.sharedModelContainer()) } struct AddTestStageView: View { @Environment(\.modelContext) var modelContext @Binding var selectedTestStage: TestStageClass // MARK: - ISSUE LOCATION /// Using this Query with filter causes it to be run after each editing on parent view - such as each letter when editing a name. @Query(filter: #Predicate<TestStageClass> { $0.isActive }) private var testStageClasses: [TestStageClass] /// Using this query doesn't have the issue, then need filter in ForEach. // @Query() private var testStageClasses: [TestStageClass] var body: some View { Picker("stage", selection: $selectedTestStage) { // filter and sort here does not affect issue with above Query predicate filter. ForEach(testStageClasses.filter(\.isActive).sorted(by: { $0.displayOrder < $1.displayOrder } ), id: \.id) { stage in Text("\(stage.name)") .tag(stage) } } } } class DataManager { static let shared = DataManager() private var modelContainer: ModelContainer? = nil public func sharedModelContainer(inMemory: Bool = false) -> ModelContainer { let schema = Schema([TestStageClass.self]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: inMemory) do { self.modelContainer = try ModelContainer(for: schema, configurations: [modelConfiguration]) checkDataExists() return self.modelContainer! } catch { fatalError("Could not create sharedModelContainer. Schema:\(schema.entities.map(\.name)), \((modelConfiguration.isStoredInMemoryOnly) ? "in memory only" : "in disk"):\n\(error.localizedDescription)") } } private func checkDataExists() { let mainContext = self.modelContainer!.mainContext print("checkDataExists") do { let classData: [TestStageClass] = try mainContext.fetch(FetchDescriptor<TestStageClass>()) if classData.isEmpty { mainContext.insert(TestStageClass(name: "Beginning", isActive: true, displayOrder: 0)) mainContext.insert(TestStageClass(name: "Second Middle", isActive: false, displayOrder: 2)) mainContext.insert(TestStageClass(name: "Middle", isActive: true, displayOrder: 1)) mainContext.insert(TestStageClass(name: "End", isActive: true, displayOrder: 3)) } if mainContext.hasChanges { try? mainContext.save() print("Added Default Data for TestStageClass") } } catch { fatalError("Failed to get item count for TestStageClass: \(error.localizedDescription)") } } func getFirstTestStageClass() -> TestStageClass { let mainContext = self.modelContainer!.mainContext var tmp: TestStageClass? do { let classData: [TestStageClass] = try mainContext.fetch(FetchDescriptor<TestStageClass>()) tmp = classData.sorted(by: {$0.displayOrder < $1.displayOrder }).first } catch { fatalError("getFirstTestStageClass: \(error.localizedDescription)") } return tmp! } } Thanks, Steve
Replies
1
Boosts
0
Views
83
Activity
Feb ’26
watchOS Smart Stack widget background
A watchOS widget requires you set a container background: .containerBackground(for: .widget) { Color.black } But I see some .accessoryRectangular widgets, on the Smart Stack, using a glass background. From what I know there is no way to set this using .containerBackground. Does anyone know how to do this? Thank you
Replies
4
Boosts
1
Views
176
Activity
Feb ’26
"NavigationLink in List incorrectly highlights when destination value exists in NavigationStack path"
In SwiftUI, when using NavigationStack with a path binding containing multiple instances of the same (or many with navigationPath()) model type (since model type are class type, this issue might occur on instances of class type too), any NavigationLink in a detail view that leads to a value already present anywhere in the navigation stack (which is in the path binding) will appear incorrectly highlighted upon the view's initial appearance. This bug seems manifests specifically when the links are contained within a List. The highlighting is inconsistent - only the earliest appended value in path has link in each section displays as pressed, while links to other value appear normal. Below is a simple code to reproduce the bug. import SwiftUI import SwiftData // Simple model @available(iOS 17, *) @Model class Item { var id = UUID() var name: String var relatedItems: [Item] init(name: String = "", relatedItems: [Item] = []) { self.name = name self.relatedItems = relatedItems } } // MARK: - Bug Reproducer @available(iOS 17, *) struct BugReproducerView: View { @State private var path: [Item] = [] let items: [Item] init() { let item1 = Item(name: "Item 1", relatedItems: []) let item2 = Item(name: "Item 2", relatedItems: [item1]) item1.relatedItems = [item2] self.items = [item1, item2] } var body: some View { NavigationStack(path: $path) { List(items) { item in NavigationLink(item.name, value: item) } .navigationTitle("Items") .navigationDestination(for: Item.self) { item in DetailView(item: item) } } } } // MARK: - Detail View with Bug @available(iOS 17, *) struct DetailView: View { let item: Item var body: some View { List { Section("Info") { Text("Selected: \(item.name)") } if !item.relatedItems.isEmpty { Section("Related") { ForEach(item.relatedItems) { related in NavigationLink(related.name, value: related) } } } } .navigationTitle(item.name) } } #Preview { if #available(iOS 17, *) { BugReproducerView() } else { } }
Replies
0
Boosts
0
Views
55
Activity
Feb ’26
TimelineView using ExplicitTimelineSchedule ignores last date?
Hi, everyone. I'm trying my first TimelineView with an explicit schedule, but my attempt – and even the simple example from the documentation – doesn't seem to work as documented. Here's what the documentation says an explicit schedule does: The timeline view updates its content on exactly the dates that you specify, until it runs out of dates, after which it stops changing. And it gives this example: let dates = [ Date(timeIntervalSinceNow: 10), // Update ten seconds from now, Date(timeIntervalSinceNow: 12), // and a few seconds later. ] struct MyView: View { var body: some View { TimelineView(.explicit(dates)) { context in Text(context.date.description) } } } There are stipulations about what the view – which always displays some version of its content body – will do given only past or future dates, but it seems clear we should expect the view in this example to redraw at least once after it appears. Here's the rest of the discussion from the documentation with my comments after testing what's stated: If the dates you provide are in the past, the timeline view updates exactly once with the last entry. That seems true, considering the "update" to be the initial draw. If you only provide dates in the future, the timeline view renders with the current date until the first date arrives. Not exactly: it looks the "date" property of the initial render is the (future) date of the first schedule entry, even though it's drawn early. When the first date does arrive, the body closure doesn't seem to be called. Only on the next date, if there is one, is it called again. If you provide one or more dates in the past and one or more in the future, the view renders the most recent past date, refreshing normally on all subsequent dates. That also seems correct, except… … that in every scenario, the final date entry seems to be ignored completely! In other words, unless all date entries are in the past, the Timeline View stops before it runs out of dates. That documented example from the start, which we expect to redraw at least once after it appears? When I test it in a Playground, it appears, but doesn't redraw at all! So, that's my main point of confusion after experimenting with TimelineView for the first time. I can achieve my own goal by appending an extra entry to my explicit schedule – even appending an entry identical to the previous "final" entry seems to work – but naturally that leaves me unclear about why I need to. If anyone can tell me what I'm not understanding, I'd be grateful.
Replies
4
Boosts
2
Views
857
Activity
Feb ’26
SwiftUI Link view corrupts destination URLs when using a leading-zero padded IPv4 address.
There appears to be a bug in Link with IPv4 addresses with padding in the second octet, on macOS and iOS both. struct LinkViewBug: View { let works = URL(string: "http://172.16.1.1")! let alsoWorks = URL(string: "http://172.16.001.001")! let doesntWork = URL(string: "http://172.016.001.001")! let alsoDoesntWork = URL(string: "http://172.016.1.1")! var body: some View { // destination -> http://172.16.1.1 Link(works.formatted(), destination: works) Link(alsoWorks.formatted(), destination: alsoWorks) // destination -> http://172.14.1.1 ? Link(doesntWork.formatted(), destination: doesntWork) Link(alsoDoesntWork.formatted(), destination: alsoDoesntWork) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
0
Boosts
0
Views
75
Activity
Feb ’26
In SwiftUI for macOS, is there an equivalent to NSControl.BorderShape?
In macOS 26, there is a new property on NSControl called .borderShape. The WWDC 2025-310 video says it can be used to "Override preferred shape of control to suit your design." and that it's available on NSButton, NSPopUpButton and NSSegmentedControl. Is there an equivalent to that property for SwiftUI? For example, given the following SwiftUI code: Button("Eject") { } .borderShape(...) <-- ? How can I apply a .borderShape that would match those on controls created in AppKit? I'm aware that SwiftUI offers a plethora of ways to custom design a button such that it can have rounded corners, but I'm interested in this particular property so that SwiftUI buttons and AppKit buttons in the same app have the same look-and-feel.
Replies
1
Boosts
0
Views
97
Activity
Feb ’26
Do SwiftUI Segmented Controls on macOS 26 support the icon and title label style?
On macOS 26.3, Xcode 26.3, why does a labelStyle of titleAndIcon not show both the title and the icon of a label? The label styles iconOnly and titleOnly behave as expected. Picker("Label Demo", selection: $selectedItem) { Label { Text("File") } icon: { Image(systemName: "doc") } Label { Text("Folder") } icon: { Image(systemName: "folder") } } .labelStyle(.titleAndIcon) .pickerStyle(.segmented) Note that there is no icon shown. Placing the .labelStyle modifier in different places has no effect. The icon is correctly shown when the labelStyle is set to .iconOnly. An NSSegmentedControl created with AppKit and presented in an NSViewRepresentable does correctly show titles and icons if configured appropriately. Tested on: macOS 26.3 (25D125) Xcode 26.3 (17C519) A brand new SwiftUI "macOS App" project.
Replies
2
Boosts
0
Views
95
Activity
Feb ’26
CarPlay: Can third-party audio apps add a Search/Siri button next to the Now Playing button like Apple Music?
Hi, In Apple Music on CarPlay, there is a Search button shown next to the Now Playing (NPS) button in the top navigation bar. Tapping this Search button activates Siri voice search. I want to understand: Does CarPlay allow third-party audio apps to add a similar Search button in the top bar (next to the Now Playing button)? Which can be used to trigger Siri from the screen UI (not steering-wheel button or “Hey Siri”)? Is there any supported approach for screen-based Siri activation other than the guidance here: https://developer.apple.com/documentation/carplay/cplisttemplate#Integrating-Siri-Into-Your-Template-App Basically, is the Apple Music search/Siri button a publicly available CarPlay capability, or is it system-reserved?
Replies
0
Boosts
0
Views
68
Activity
Feb ’26
How to delete a row from a table
To display rows and columns of data in a nice layout like a spreadsheet I use a table like the code here .. Table(array) { TableColumn("Ticker", value: \\.ticker) TableColumn("Other", value: \.other) } To delete a row from the table the advice is to use a ForEach loop. Since I don’t use a ForEach loop, how do I delete rows from the table ? With this code there is no way to attach a .onDelete modifier or a Button Any advice would be much appreciated Thank you
Topic: UI Frameworks SubTopic: SwiftUI
Replies
1
Boosts
0
Views
58
Activity
Feb ’26
Does anyone know how to prevent Liqud Glass from stretching when elements with the glassEffect are dragged?
When making an element with .glassEffect(.clear.interactive()) draggable, it stretches as it moves. It seems like it's meant to stretch as you move your finger away from the element, but it doesn't make sense if the element is following your finger as you drag it. Is this a bug, or is there a way to disable this behavior without removing the other "interactive" animations? P.S. The shiny border around the elements seems to be a rounded rectangle or capsule, but the actual element's shape seems to be stretched. That also appears to be a bug.
Replies
0
Boosts
0
Views
93
Activity
Feb ’26
iOS 26.3: Memory crash with @AppStorage and view transitions
I'm experiencing consistent memory crashes in iOS 26.3 (23D127) when using @AppStorage with view transitions. Environment: Device: iPhone 17 Pro Max iOS: 26.3 (23D127) Xcode: 26.2 (17C52) Issue: App crashes with "Terminated due to memory issue" when: Using @AppStorage to manage state Calling UserDefaults.set() in completion handler Transitioning to new view based on changed state Workaround: Using @State instead of @AppStorage prevents crash. Feedback: FB############ (your number) Has anyone else experienced this? Is this a known issue in iOS 26?
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
57
Activity
Feb ’26
App architectures with Swift UI and Apple Intelligence
I read some article that said for using Apple Intelligence as an integrated part of an app, instead of tacked on, MVVM and VIPER are not good fits. Would that be accurate? What other architectures could work better? (The author didn’t suggest any replacements.)
Replies
0
Boosts
0
Views
64
Activity
Feb ’26
.navigationDestination(isPresented hangs after reboot in watchOS when destination view contains @Environment(\.dismiss)
.navigationDestination(isPresented) hangs after reboot (when called within 2 minutes of reboot) in watchOS when destination view contains @Environment(.dismiss). Feedback: FB21077151 Second button hangs after reboot. Hangs in watchOS 26.0 and 26.4 on a physical device. struct ContentView: View { @State var presentView1 : Bool = false @State var presentView2 : Bool = false var body: some View { NavigationStack { VStack { Button("Show View 1") { presentView1.toggle() } Button("Show View 2") { presentView2.toggle() } } .navigationDestination(isPresented: $presentView1, destination: {TestView1()}) .navigationDestination(isPresented: $presentView2, destination: {TestView2()}) } } } struct TestView1: View { var body: some View { Text("View 1") } } struct TestView2: View { @Environment(\.dismiss) var dismiss var body: some View { Text("View 2") } }
Replies
2
Boosts
0
Views
107
Activity
Feb ’26