To whom it may concern that deals with bugs in SwiftUI for iOS 26:
Inadvertently discovered a bug which duplicates ToolbarItem in any placement in the toolbar when navigationBarBackButtonHidden is set to true.
.toolbar{
ToolbarItem(placement: .confirmationAction) {
Button("Stop", systemImage: "stop.fill"){
//some action
}
}
}
.navigationBarBackButtonHidden(true)
Expected Behavior
Show the ToolbarItem
Actual Behavior
Duplicates items in the placement position.
Thank you.
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.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
The following code segments run when building and running the app, or after going home and re-opening the app, but now when quitting the app and re-opening it again. What code can do that?
init() {
print("test")
}
.onAppear {
print("test)
}
.onChange(of: scenePhase) { _, newValue in
print(newValue)
}
I'm developing an iOS app that handles custom file types (e.g., .k files), and I want to ensure my app's icon appears in Core Spotlight search results, similar to how 两步路户外助手's icon shows up for associated files (as shown in the attached screenshot from iOS search).
I know one standard way is to configure CFBundleDocumentTypes in the Info.plist to declare supported document types, which allows the system to associate files with my app and display the icon in search. However, I'm looking for alternative approaches or additional configurations that could achieve this without relying solely on CFBundleDocumentTypes, or perhaps in combination with it for better integration.
For context:
This is for iOS 26+ (or latest versions).
The goal is to have the app icon visible directly in Spotlight/Core Spotlight results when searching for files or content indexed by my app.
I've tried basic NSUserActivity and CSSearchableItem indexing, but the icon doesn't always appear as expected for file associations.
Has anyone implemented this through other means, like exported UTIs, Launch Services, or custom searchable attributes? Any code snippets, documentation links, or best practices would be appreciated!
(Attach your Figure 2 screenshot here to illustrate the desired behavior, e.g., the .k file with the app icon in search results.)
[Also submitted as FB21536505]
When presenting a NavigationStack inside a .sheet, applying .tint(Color) does not affect the system back button on pushed destinations. The sheet’s close button adopts the tint, but the back chevron remains the default system color.
REPRO
Create a new iOS project and replace ContentView.swift with the code below.
—or—
Present a .sheet containing a NavigationStack.
Apply .tint(.red) to the NavigationStack or sheet content.
Push a destination using NavigationLink.
EXPECTED
The back button chevron adopts the provided tint color, consistent with other toolbar buttons and UIKit navigation behavior.
ACTUAL
The back button chevron remains the default system color.
NOTES
Reproduces consistently on:
iOS 26.2 (23C54)
iOS 26.3 (23D5089e)
SCREEN RECORDING
SAMPLE CODE
import SwiftUI
struct ContentView: View {
@State private var isSheetPresented = false
var body: some View {
Button("Open Settings Sheet") {
isSheetPresented = true
}
.sheet(isPresented: $isSheetPresented) {
NavigationStack {
List {
NavigationLink("Push Detail") {
DetailView()
}
}
.navigationTitle("Settings")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .automatic) {
Button("Close", systemImage: "xmark") {
isSheetPresented = false
}
}
}
}
.tint(.red)
}
}
}
private struct DetailView: View {
var body: some View {
List {
Text("Detail View")
}
.navigationTitle("Detail")
.navigationBarTitleDisplayMode(.inline)
}
}
When using UITraitBridgedEnvironmentKey to pass a trait value to the swift environment, it causes a crash when trying to access the value from the environment.
The issue seems to be related to how swift uses the UITraitBridgedEnvironmentKey protocol since the crash occurs in swift::_getWitnessTable () from lazy protocol witness table accessor…. It can occur when calling any function that is generic using the UITraitBridgedEnvironmentKey type.
I originally encountered the issue when trying to use a UITraitBridgedEnvironmentKey in SwiftUI, but have been able to reproduce the issue with any function with a similar signature.
https://developer.apple.com/documentation/swiftui/environmentvalues/subscript(_:)-9zku
Steps to Reproduce
Requirements for the issue to occur
Project with a minimum iOS version of iOS 16
Build the project with Xcode 26
Run on iOS 18
Add the following code to a project and call foo(key: MyCustomTraitKey.self) from anywhere.
@available(iOS 17.0, *)
func foo<K>(key: K.Type) where K: UITraitBridgedEnvironmentKey {
// Crashes before this is called
}
@available(iOS 17.0, *)
public enum MyCustomTraitKey: UITraitBridgedEnvironmentKey {
public static let defaultValue: Bool = false
public static func read(from traitCollection: UITraitCollection) -> Bool { false }
public static func write(to mutableTraits: inout UIMutableTraits, value: Bool) {}
}
// The crash will occur when calling this. It can be added to a project anywhere
// The sample project calls it from scene(_:willConnectTo:options:)
foo(key: MyCustomTraitKey.self)
For example, I added it to the SceneDelegate in a UIKit Project
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if #available(iOS 17, *) {
// The following line of code can be placed anywhere in a project, `SceneDelegate` is just a convenient place to put it to reproduce the issue.
foo(key: MyCustomTraitKey.self)
// ^ CRASH: Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)
}
}
}
Actual Behaviour
The app crashes with the stack trace showing the place calling foo but before foo is actually called. (ie, a breakpoint or print in foo is never hit)
#0 0x000000019595fbc4 in swift::_getWitnessTable ()
#1 0x0000000104954128 in lazy protocol witness table accessor for type MyCustomTraitKey and conformance MyCustomTraitKey ()
#2 0x0000000104953bc4 in SceneDelegate.scene(_:willConnectTo:options:) at .../SceneDelegate.swift:20
The app does not crash when run on iOS 17, or 26 or when the minimum ios version is raised to iOS 17 or higher.
It also doesn't crash on iOS 16 since it's not calling foo since UITraitBridgedEnvironmentKey was added in iOS 17.
Expected behaviour
The app should not crash. It should call foo on iOS 17, 18, and 26.
Running print operation on WKWebView I hit EXC_BREAKPOINT and there is all kinds of console spew that looks concerning:
ERROR: The NSPrintOperation view's frame was not initialized properly before knowsPageRange: returned. (WKPrintingView)
** CGContextClipToRect: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.**
WebContent[7743] networkd_settings_read_from_file Sandbox is preventing this process from reading networkd settings file at "/Library/Preferences/com.apple.networkd.plist", please add an exception.
CRASHSTRING: XPC_ERROR_CONNECTION_INVALID from launchservicesd
CRASHSTRING: rdar://problem/28724618 Process unable to create connection because the sandbox denied the right to lookup com.apple.coreservices.launchservicesd and so this process cannot talk to launchservicesd.
WebContent[7921] The sandbox in this process does not allow access to RunningBoard.
Safe to ignore all this?
I built this very simple example to demonstrate the issue im facing on iOS 26 when trying to use custom ToolbarItem element for .largeTitle.
Code:
struct ContentView: View {
var body: some View {
NavigationStack {
Screen()
.navigationTitle("First")
.toolbar {
ToolbarItem(placement: .largeTitle) {
Text("First")
.font(.largeTitle)
.border(Color.black)
}
}
.navigationDestination(for: Int.self) { integer in
DestinationScreen(integer: integer)
}
}
}
}
struct Screen: View {
var body: some View {
List {
ForEach(1..<50) { index in
NavigationLink(value: index) {
Text(index.description)
.font(.largeTitle)
}
}
}
}
}
struct DestinationScreen: View {
let integer: Int
var body: some View {
HStack {
Text(integer.description)
.font(.largeTitle)
Spacer()
}
.padding()
.navigationTitle(integer.description)
.toolbar {
ToolbarItem(placement: .largeTitle) {
Text(integer.description)
.font(.largeTitle)
.border(Color.black)
}
}
}
}
As shown on the gif, when navigating between pages, titles are going to overlap for a short while.
Other questions:
Why is it required for .navigationTitle() to exist (empty string wouldn't work!) so that the ToolbarItem .largeTitle can render at all?
If none is added, this ToolbarItem simply won't appear
Why isn't the large title naturally aligning to the leading side?
Apple doc. doesn't mention any of this behaviour as far as I know but in general these placement should replicate known established behaviours, and .largeTitle should be leading aligned.
Another issue is shown on the image below. When using both .largeTitle and .title (to simulate the same behaviour of transition between large and inline title when scrolling), both will appear at the same time. The large title will disappear as you scroll down which is fine.
Topic:
UI Frameworks
SubTopic:
SwiftUI
In the new iOS 26 design, the navigation bar and tab bar will have a dark gradient background. We found that the color of this gradient depends on the background color of the page. For example, in the following page, our background color is green, so the navigation bar and tab bar will change the gradient to green.
Is there any way to change this gradient color?
I tried .toolbarBackground(.hidden, for: .navigationBar), but does not work。
I tried .toolbarBackground(LinearGradient(colors: [.black.opacity(0.4), .black.opacity(0)], startPoint: .top, endPoint: .bottom), for: .navigationBar), but it looks like the default gradient is the superposition of the gradient I defined, not a replacement.
Topic:
UI Frameworks
SubTopic:
SwiftUI
Let me ask the general question first, then explain the context...
Each Tab of a TabView defines a separate View hierarchy. (I'm assuming that the root view of each Tab defines its own NavigationStack.) Since an @Environment is supposed to serve data to the child views in its view hierarchy, does this mean that it is possible to define Environments in each tab's root view with the same name (i.e. key) but different values? (I.e., I want a subview to access an environment value for the current view hierarchy without requiring that the subview have any knowledge of which hierarchy it is being called from.)
The actual use case has to do with using @Environment in a tabbed application to inject a router in subviews. (Each Tab has its own NavigationStack and its own NavigationPath.)
I have an @Observable router class which manages a NavigationPath.. The root view of each Tab in the application has its own instance of that router object (and hence, it's own NavigationPath). I want to inject that router into all of the subviews in each Tab's view hierarchy, so that I can use path-based navigation.
My current implementation injects the router throughout the view hierarchies via constructor injection. This works, but is a real pain and includes a bunch of duplicate code. I would like to use @Environment injection instead, but this can only work if @Environment stores its EnvironmentValues on a per view-hierarchy (rather than a per-application) basis.
So,
can this approach work?
what experience can you share concerting router-based navigation in a TabView-based app?
Thanks.
DisplayRepresentation.Image(systemName:tintColor:symbolConfiguration:) no longer applies the provided tintColor reliably since iOS 18.
Observed behavior by OS version:
iOS 17: SF Symbol tint is applied consistently as expected.
iOS 18: SF Symbol tint is inconsistent and sometimes appears with incorrect or seemingly random colors instead of the provided tintColor.
iOS 26: SF Symbol is rendered without any tint (default monochrome), completely ignoring the provided tintColor.
This appears to be a regression in how App Intents renders DisplayRepresentation.Image with tinting across OS versions.
iOS17.5:
iOS 18.6:
iOS26:
Code:
import AppIntents
import UIKit
struct CategoryEntity: AppEntity, Hashable {
var id: Category.ID
var name: String
var icon: Int?
var color: Int?
var parentCategoryName: String?
init(from category: Category) {
self.id = category.id
self.name = category.name
self.icon = category.icon
self.color = category.parent?.color ?? category.color
self.parentCategoryName = category.parent?.name
}
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(
title: "\(name)",
subtitle: parentCategoryName.map { "\($0)" },
image: .init(
systemName: Icon.sfSymbolName(from: icon),
tintColor: ColorTag.from(color)
)
)
}
static let typeDisplayRepresentation: TypeDisplayRepresentation = "Category"
static let defaultQuery = CategoryQuery()
}
[Documentation API]
(https://developer.apple.com/documentation/appintents/displayrepresentation/image-swift.struct/init(systemname:tintcolor:symbolconfiguration:)-3snvy?changes=_5)
Hi everyone,
I believe this should be a simple and expected default behavior in a real-world app, but I’m unable to make it work:
I have a View (a screen/page in this case) that calls an endpoint using async/await.
If the endpoint hasn’t finished, but I navigate forward to a DetailView, I want the endpoint to continue fetching data (i.e., inside the @StateObject ViewModel that the View owns). This way, when I go back, the View will have refreshed with the fetched data once it completes.
If the endpoint hasn’t finished and I navigate back to the previous screen, I want it to be canceled, and the @StateObject ViewModel should be deinitialized.
I can achieve 1 and 3 using the .task modifier, since it automatically cancels the asynchronous task when the view disappears:
view
.task { await vm.getData() }
I can achieve 1 and 2 using a structured Task in the View (or in the ViewModel, its the same behavior), for example:
.onFirstAppearOnly {
Task { away vm.getData() }
}
onFirstAppearOnly is a custom modifier that I have for calling onAppear only once in view lifecycle. Just to clarify, I dont think that part is important for the purpose of the example
My question is:
How can I achieve all three behaviors?
My minimum deployment target is iOS 15, and I’m using NavigationView + NavigationLink. However, I have also tried using NavigationStack + NavigationPath and still couldn’t get it to work.
Any help would be much appreciated. Thank you!
Hello,
I am experiencing an issue related to SFSafariViewController during App Store review, and I would like to ask whether this could be an OS-level behavior or a known issue.
App context
Our app supports iPhone only
During App Review, the reviewer tested the app on an iPad
The app was rejected because the keyboard did not appear
Issue description
The problematic screen presents a sign-up web page using SFSafariViewController
When tapping the nickname input field:
The keyboard area appears (the layout shifts as if the keyboard will be shown)
However, the actual keyboard does not appear
Reproducibility
We tested this issue on our own physical devices and on iPad simulators with the same app configuration
However, we are unable to reproduce the issue in either environment
What we have checked
The web page uses a standard HTML
There is no custom keyboard handling or keyboard-related logic in the app
The app simply presents SFSafariViewController with a URL
Locale-related question
The URL includes a locale parameter (e.g. LOCALE=US)
Could the app’s locale, system language, or region settings affect keyboard behavior in SFSafariViewController?
Is it possible that a specific locale or language configuration on iPad could cause the keyboard to fail to appear?
Questions
Is there any known issue or OS-level behavior where the keyboard may fail to appear in SFSafariViewController on iPad?
Could this be related to:
Locale / language / region settings
iPad multitasking or keyboard modes
External keyboard state
Specific iPadOS versions
Are there any recommended workarounds or defensive implementations for this scenario?
Any insights or similar experiences would be greatly appreciated.
Thank you.
Topic:
UI Frameworks
SubTopic:
General
I’m exploring macOS development, comparing Mac Catalyst apps vs native AppKit/SwiftUI apps.
What are the main limitations of Catalyst today?
In what scenarios is a native AppKit or SwiftUI app unavoidable?
Any insights are much appreciated — I’m trying to understand when Catalyst is sufficient and when going native is worth the extra effort.
I have a program that installs an NSStatusItem button in the Menubar. It registers for both the right and left click events.
Before Tahoe, clicking into the statusitem with the mouse at the very top of the menubar would also invoke the Action handler, be it a right or a left click.
Now, with Tahoe, where the menubar height was changed from 24 to 30, left clicks at the top edge still trigger the Action event, but right clicks do not - they only work if moving the mouse a few pixels down.
This is quite inconvenient - the idea of the menubar being at the edge of the screen was always that one can just push the mouse to the edge and then click to interact. Tahoe has broken this basic GUI concept now partially.
And since left clicks still work, it suggests that I don't do anything wrong - the clicks are controlled by the framework, and I'm never asked to provide a frame in which the clicks shall be accepted.
It's that Apple's code apparently now uses the smaller statusitem's bounds instead of the full menu bar height for hit-testing.
Is that on purpose or a bug?
And does someone know a work-around, i.e. can I hook into the click-handler at a deeper level and do the hit testing myself? I've tried adding a subview to the statusitem's window's contentView, but that also only reacts to clicks in the smaller area.
Topic:
UI Frameworks
SubTopic:
AppKit
Anytime I launch a view that contains a textfield, as soon as it’s in focus the view dismisses, and I log this warning, I have tried everything I could think of and still no solution, anyone know a workaround to this?
note: this happens both on simulator and physical devices
-[rtiinputsystemclient remotetextinputsessionwithid:performinputoperation:] perform input operation requires a valid sessionid. input modality = keyboard, input operation = , custom infotype = uiemojisearchoperations
Hello Apple Developer Forum Community,
I’ve got a problem with the display of my SwiftUI View, that is tested on my physical iPhone. It’s shown very small (Picture) and on the Xcode Canvas Simulator it get’s shown right.
What is the problem with my code?
Is there any reason why the SwiftUI Image hasn’t a direct init(data: Data) like UIImage from UIKit?
In my opinion it’s very unintuitive and expensive to create a UIImage in the first step to create a SwiftUI Image with Image(uiImage: UIImage) in the second step.
In addition to that, this causes unnecessary UIKit imports.
In my opinion this is a very obvious small in the API, so are there any reasons why it is what it is?
Best regards
Are we allowed to use AI-generated images for our Swift Student Challenge Project? The instructions say that we can use third party content but must cite/credit it and be transparent about it. Are we allowed to do the same for AI-generated images? Will this dock points on creativity?
I have an iOS application that derives on UITextInput to enter text. I have also overridden pressesBegan() and pressesEnded() in order to have some extra keyboard management (auto-repeat, special actions for arrow keys, function keys...)
That works well for single-character languages (most roman languages, such as English, French, etc).
For multi-character languages (Chinese, Japanses, Korean, Hindi), I can detect that the keyboard has been set to that language, and switch back to the default version of pressesBegan():
if let keyboardLanguage = self.textInputMode?.primaryLanguage {
if (keyboardLanguage.hasPrefix("hi") || keyboardLanguage.hasPrefix("zh") || keyboardLanguage.hasPrefix("ja") || keyboardLanguage.hasPrefix("ko")) {
super.pressesBegan(presses, with: event)
}
}
But that strategy fails with the Tiếng Việt Telex keyboard (for Vietnamese language input). The way that keyboard works (as you can see if you open a document in Pages) is that you type as you go: T-i-e-n-g V-i-e-t T-e-l-e-x and the system adds the relevant diacritics once you've finished a word, so typing "Tieng Viet Telex" gives you "Tiếng Việt Telex" on the screen.
Is there any documentation on the inner workings of this specific keyboard? What should I do (or not do) in order to make my application compatible with Tiếng Việt Telex?
I’m developing an iOS app that integrates with CallKit.
Starting from iOS 26, I’ve noticed that the system automatically presents a top banner / toast-style UI when a CallKit call becomes active (see attached screenshot). This UI appears to be fully managed by the system.
On iOS versions prior to iOS 26, this UI did not appear under the same CallKit configuration.
What I’ve observed
The banner is displayed automatically by the system
It appears at the top of the screen, similar to a toast or call status banner
It is not a view created by my app
I could not find any public API or CallKit configuration related to dismissing or controlling it
My questions:
Is this top banner an intended system behavior change in newer iOS versions?
Is there any public API to dismiss, hide, or customize this UI?
If not, is this UI considered non-dismissible by design?
Any clarification on the expected behavior or recommended approach would be greatly appreciated.