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

All subtopics
Posts under UI Frameworks topic

Post

Replies

Boosts

Views

Activity

How to control when a DatePicker "pops up"
I have a Date field that holds the scheduled start date for an activity.. However, activities can be unscheduled (i.e., waiting to be scheduled at some other time). I want to use Date.distantFuture to indicate that the activity is unscheduled. Therefore I am looking to implement logic in my UI that looks something like @State private var showCalendar: Bool = false if date == .distantFuture { Button("unscheduled") { showCalendar.toggle() }.buttonStyle(.bordered) } else { DatePicker(section: $date) } .popover(isPresented: $showCalendar) { <use DatePicker Calendar view> } But this approach requires that I access the DataPicker's Calendar view and I don't know how to do that (and I don't ever what my users to see "Dec 31, 4000"). Any ideas? (BTW, I have a UIKit Calendar control I could use, but I'd prefer to use the standard control if possible.)
4
0
148
Mar ’25
Data Fetch issue from SensorKit
I want use SensorKit data for research purposes in my current app. I have applied for and received permission from Apple to access SensorKit Data. I have granting all the necessary permissions. But no data retrieved. I am using didCompleteFetch for retrieving data from Sensorkit. CompleteFetch method calls but find the data. Below is my SensorKitManager Code. import SensorKit import Foundation protocol SensorManagerDelegate: AnyObject { func didFetchPhoneUsageReport(_ reports: [SRPhoneUsageReport]) func didFetchAmbientLightSensorData(_ data: [SRAmbientLightSample]) func didFailFetchingData(error: Error) } class SensorManager: NSObject, SRSensorReaderDelegate { private let phoneUsageReader: SRSensorReader private let ambientLightReader: SRSensorReader weak var delegate: SensorManagerDelegate? override init() { self.phoneUsageReader = SRSensorReader(sensor: .phoneUsageReport) self.ambientLightReader = SRSensorReader(sensor: .ambientLightSensor) super.init() self.phoneUsageReader.delegate = self self.ambientLightReader.delegate = self } func requestAuthorization() { let sensors: Set<SRSensor> = [.phoneUsageReport, .ambientLightSensor] guard phoneUsageReader.authorizationStatus != .authorized || ambientLightReader.authorizationStatus != .authorized else { log("Already authorized. Fetching data directly...") fetchSensorData() return } SRSensorReader.requestAuthorization(sensors: sensors) { [weak self] error in DispatchQueue.main.async { if let error = error { self?.log("Authorization failed: \(error.localizedDescription)", isError: true) self?.delegate?.didFailFetchingData(error: error) } else { self?.log("Authorization granted.") self?.fetchSensorData() } } } } func fetchSensorData() { guard let fromDate = Calendar.current.date(byAdding: .day, value: -1, to: Date()) else { log("Failed to calculate 'from' date.", isError: true) return } let fromTime = SRAbsoluteTime.fromCFAbsoluteTime(_cf: fromDate.timeIntervalSinceReferenceDate) let toTime = SRAbsoluteTime.fromCFAbsoluteTime(_cf: Date().timeIntervalSinceReferenceDate) let phoneUsageRequest = SRFetchRequest() phoneUsageRequest.from = fromTime phoneUsageRequest.to = toTime phoneUsageRequest.device = SRDevice.current let ambientLightRequest = SRFetchRequest() ambientLightRequest.from = fromTime ambientLightRequest.to = toTime ambientLightRequest.device = SRDevice.current phoneUsageReader.fetch(phoneUsageRequest) ambientLightReader.fetch(ambientLightRequest) } // ✅ Delegate Methods func sensorReader(_ reader: SRSensorReader, didCompleteFetch fetchRequest: SRFetchRequest) { Task.detached { if reader.sensor == .phoneUsageReport { if let samples = reader.fetch(fetchRequest) as? [SRPhoneUsageReport] { DispatchQueue.main.async { [weak self] in self?.delegate?.didFetchPhoneUsageReport(samples) } } } else if reader.sensor == .ambientLightSensor { if let samples = reader.fetch(fetchRequest) as? [SRAmbientLightSample] { DispatchQueue.main.async { [weak self] in self?.delegate?.didFetchAmbientLightSensorData(samples) } } } } } func sensorReader(_ reader: SRSensorReader, fetching fetchRequest: SRFetchRequest, didFetchResult result: SRFetchResult<AnyObject>) -> Bool { return true } func sensorReader(_ reader: SRSensorReader, fetching fetchRequest: SRFetchRequest, failedWithError error: any Error) { DispatchQueue.main.async { [weak self] in self?.delegate?.didFailFetchingData(error: error) } } // MARK: - Logging Helper private func log(_ message: String, isError: Bool = false) { if isError { print("❌ [SensorManager] \(message)") } else { print("✅ [SensorManager] \(message)") } } } And ViewController import UIKit import SensorKit class ViewController: UIViewController { private var sensorManager: SensorManager! override func viewDidLoad() { super.viewDidLoad() setupSensorManager() } private func setupSensorManager() { sensorManager = SensorManager() sensorManager.delegate = self sensorManager.requestAuthorization() } } // MARK: - SensorManagerDelegate extension ViewController: SensorManagerDelegate { func didFetchPhoneUsageReport(_ reports: [SRPhoneUsageReport]) { for report in reports { print("Total Calls: (report.totalOutgoingCalls + report.totalIncomingCalls)") print("Outgoing Calls: (report.totalOutgoingCalls)") print("Incoming Calls: (report.totalIncomingCalls)") print("Total Call Duration: (report.totalPhoneCallDuration) seconds") } } func didFetchAmbientLightSensorData(_ data: [SRAmbientLightSample]) { for sample in data { print(sample) } } func didFailFetchingData(error: Error) { print("Failed to fetch data: \(error.localizedDescription)") } } Could anyone please assist me in resolving this issue? Any guidance or troubleshooting steps would be greatly appreciated.
0
0
179
Mar ’25
WKWebview/UIViewRepresentable - Hide Loading... text while webview is loading
I have the following UIViewRepresentable that loads a webview. struct SViewerWebView: UIViewRepresentable{ var url: String var token: String @Binding var isLoading: Bool func makeCoordinator() -> Coordinator { Coordinator(self) } func makeUIView(context: Context) -> WKWebView { let webConfiguration = WKWebViewConfiguration() let webView = WKWebView(frame:.zero,configuration:webConfiguration) webView.allowsBackForwardNavigationGestures = true webView.isInspectable = true webView.navigationDelegate = context.coordinator return webView } func updateUIView(_ uiView: WKWebView, context: Context) { guard let urlforRequest = URL(string: url) else { print("❌ Invalid URL:", url) return } var request = URLRequest(url: urlforRequest) request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization") print("🔄 Loading URL:", url) print("🛠 Headers:", request.allHTTPHeaderFields ?? [:]) uiView.load(request) } //coordinator class Coordinator: NSObject, WKNavigationDelegate { var parent: SViewerWebView init(_ parent: SViewerWebView) { self.parent = parent } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { DispatchQueue.main.async { self.parent.isLoading = false // Hide loading when page loads } } func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { DispatchQueue.main.async { self.parent.isLoading = false // Hide loading on error } } } } This is the state before the content loads. At this point a ProgressView() is displayed: The problem comes in the step between screenshot 1 and 3: as you can see in below pictures, before navigating to the webview content, there is a default loading text that still showing up. Apparently, it seems to be the default behavior from the wkwebview. How can I hide that text status? my view component: var body: some View { ZStack{ SViewerWebView(url: webUrl,token: TokenManager.getToken()!,isLoading: $isLoading) if isLoading{ VStack { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .scaleEffect(1.5) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } } .ignoresSafeArea() }
Topic: UI Frameworks SubTopic: SwiftUI
1
0
85
Mar ’25
Avoiding logoff when installing new/modified InputMethodKit input source
It appears that on all recent versions of macOS when adding a new InputSource in /Library/Input Methods (or modifying an existing one there) the user needs to logoff and log back in in order for Keyboard/Input Sources in System Settings and Input Menu in menu bar to pick up the changes. Is there a way to avoid this? That is, some notification to send or API to call to tell both of these "hey, things might have changed on disk, please re-read the info, and update the UI". 🙂
1
0
290
Mar ’25
How to add more padding bellow a TextView when the keyboard is shown
When i have TextField inside ScrollView and tap on it the keyboard is shown as expected. But it seems that the TextField is moved up just enough to show the input area but i want to be moved enough so that is visible in its whole. Otherwise it looks cropped. I couldn't find a way to change this behaviour. struct ContentView: View {   @State var text:String = ""   var body: some View {     ScrollView {       VStack(spacing: 10) {         ForEach(1...12, id: \.self) {           Text("\($0)…")             .frame(height:50)         }         TextField("Label..", text: self.$text)           .padding(10)           .background(.white)           .cornerRadius(10)           .overlay(             RoundedRectangle(cornerRadius: 10)               .stroke(.blue, lineWidth: 1)           )       }       .padding()       .background(.red)     }   }     }
4
3
4k
Mar ’25
SwiftUI List DisclosureGroup Rendering Issues on macOS 13 & 14
Issue Description Whenever the first item in the List is a DisclosureGroup, all subsequent disclosure groups work fine. However, if the first item is not a disclosure group, the disclosure groups in subsequent items do not render correctly. This issue does not occur in macOS 15, where everything works as expected. Has anyone else encountered this behavior, or does anyone have a workaround for macOS 13 & 14? I’m not using OutlineGroup because I need to bind to an isExpanded property for each row in the list. Reproduction Steps I’ve created a small test project to illustrate the issue: Press “Insert item at top” to add a non-disclosure item at the start of the list. Then, press “Append item with sub-item” to add a disclosure group further down. The disclosure group does not display correctly. The label of the disclosure group renders fine, but the content of the disclosure group does not display at all. Press "Insert item at top with sub-item" and the list displays as expected. Build Environment macOS 15.3.2 (24D81) Xcode Version 16.2 (16C5032a) Issue Observed macOS 13 & 14 (bug occurs) macOS 15 (works correctly) Sample Code import SwiftUI class ListItem: ObservableObject, Hashable, Identifiable { var id = UUID() @Published var name: String @Published var subItems: [ListItem]? @Published var isExpanded: Bool = true init( name: String, subjobs: [ListItem]? = nil ) { self.name = name self.subItems = subjobs } static func == (lhs: ListItem, rhs: ListItem) -> Bool { lhs.id == rhs.id } func hash(into hasher: inout Hasher) { hasher.combine(id) } } struct ContentView: View { @State private var listItems: [ListItem] = [] @State private var selectedJob: ListItem? @State private var redraw: Int = 0 var body: some View { VStack { List(selection: $selectedJob) { ForEach(self.listItems, id: \.id) { job in self.itemRowView(for: job) } } .id(redraw) Button("Insert item at top") { self.listItems.insert( ListItem( name: "List item \(listItems.count)" ), at: 0 ) } Button("Insert item at top with sub-item") { self.listItems.insert( ListItem( name: "List item \(listItems.count)", subjobs: [ListItem(name: "Sub-item")] ), at: 0 ) } Button("Append item") { self.listItems.append( ListItem( name: "List item \(listItems.count)" ) ) } Button("Append item with sub-item") { self.listItems.append( ListItem( name: "List item \(listItems.count)", subjobs: [ListItem(name: "Sub-item")] ) ) } Button("Clear") { self.listItems.removeAll() } Button("Redraw") { self.redraw += 1 } } } @ViewBuilder private func itemRowView(for job: ListItem) -> some View { if job.subItems == nil { self.itemLabelView(for: job) } else { AnyView( erasing: ListItemDisclosureGroup(job: job) { self.itemLabelView(for: job) } jobRowView: { child in self.itemRowView(for: child) } ) } } @ViewBuilder private func itemLabelView(for job: ListItem) -> some View { Text(job.name) } struct ListItemDisclosureGroup<LabelView: View, RowView: View>: View { @ObservedObject var job: ListItem @ViewBuilder let labelView: () -> LabelView @ViewBuilder let jobRowView: (ListItem) -> RowView var body: some View { DisclosureGroup(isExpanded: $job.isExpanded) { if let children = job.subItems { ForEach(children, id: \.id) { child in self.jobRowView(child) } } } label: { self.labelView() } } } }
1
0
78
Mar ’25
CoreText' CTRunDraw can't draw underline attribute in iOS18 with Xcode 16 beta
demo code : - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // Flip the coordinate system CGContextSetTextMatrix(context, CGAffineTransformIdentity); CGContextTranslateCTM(context, 0, self.bounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); NSDictionary *attrs = @{NSFontAttributeName: [UIFont systemFontOfSize:20], NSForegroundColorAttributeName: [UIColor blueColor], NSUnderlineStyleAttributeName: @(NSUnderlineStyleThick), }; // Make an attributed string NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Hello CoreText!" attributes:attrs]; CFAttributedStringRef attributedStringRef = (__bridge CFAttributedStringRef)attributedString; // Simple CoreText with CTFrameDraw CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attributedStringRef); CGPathRef path = CGPathCreateWithRect(self.bounds,NULL); CTFrameRef frame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0),path,NULL); //CTFrameDraw(frame, context); // You can comment the line 'CTFrameDraw' and use the following lines // draw with CTLineDraw CFArrayRef lines = CTFrameGetLines(frame); CGPoint lineOrigins[CFArrayGetCount(lines)]; CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), lineOrigins); for (int i = 0; i < CFArrayGetCount(lines); i++) { CTLineRef line = CFArrayGetValueAtIndex(lines, i); CGContextSetTextPosition(context, lineOrigins[i].x, lineOrigins[i].y); // CTLineDraw(line, context); // You can comment the line 'CTLineDraw' and use the following lines // draw with CTRunDraw // use CTRunDraw will lost some attributes like NSUnderlineStyleAttributeName, // so you need draw it by yourself CFArrayRef runs = CTLineGetGlyphRuns(line); for (int j = 0; j < CFArrayGetCount(runs); j++) { CTRunRef run = CFArrayGetValueAtIndex(runs, j); CTRunDraw(run, context, CFRangeMake(0, 0)); } } } this code will use CTRunDraw to draw the content , and the underline will draw and show normally in iOS17 & Xcode 15 , But when you build it with XCode16 & iOS18 beta . the underline will be missing .
2
4
762
Apr ’25
Persistent 'buildExpression unavailable' error in ContentView with switch/AppState
Hi everyone, I'm encountering a persistent build error in a SwiftUI iOS app and I'm running out of ideas. Setup: My ContentView uses two @EnvironmentObjects (GameViewModel, SettingsStore). The GameViewModel has an AppState enum (.welcome, .setup, .game). The ContentView body uses a switch viewModel.currentAppState (wrapped in a Group) to display one of three different views (WelcomeView, SetupView, GameView). Navigation between states is triggered by changing viewModel.currentAppState within withAnimation blocks in the respective subviews. Problem: I consistently get the build error 'buildExpression' is unavailable: this expression does not conform to 'View' pointing to the lines inside the .setup and .game cases of the switch statement in ContentView. Code (ContentView.swift - Simplified Test Version that STILL fails): // Zweck: Steuert die Hauptnavigation basierend auf AppState // KORRIGIERTE VERSION OHNE .animation(...) am Ende import SwiftUI struct ContentView: View { // Zugriff auf das ViewModel, um den AppState zu lesen @EnvironmentObject var viewModel: GameViewModel // SettingsStore wird von untergeordneten Views benötigt @EnvironmentObject var settingsStore: SettingsStore var body: some View { // Optional: Group um das switch-Statement, kann manchmal helfen (kannst du auch weglassen) Group { // Wechsle die Ansicht basierend auf viewModel.currentAppState switch viewModel.currentAppState { case .welcome: WelcomeView() // EnvironmentObjects an WelcomeView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.opacity) case .setup: SetupView() // EnvironmentObjects an SetupView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading))) case .game: GameView() // EnvironmentObjects an GameView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading))) } } // Ende der optionalen Group // !!! WICHTIG: KEIN .animation(...) Modifier hier !!! } } // Vorschau struct ContentView_Previews: PreviewProvider { static var previews: some View { // Erstelle Instanzen für die Vorschau let vmWelcome = GameViewModel() vmWelcome.currentAppState = .welcome let vmSetup = GameViewModel() vmSetup.currentAppState = .setup let vmGame = GameViewModel() vmGame.currentAppState = .game vmGame.currentCard = Card.defaultCards.first let settings = SettingsStore() // Zeige verschiedene Zustände in der Vorschau an Group { ContentView() .environmentObject(vmWelcome) .environmentObject(settings) .previewDisplayName("Welcome State") ContentView() .environmentObject(vmSetup) .environmentObject(settings) .previewDisplayName("Setup State") ContentView() .environmentObject(vmGame) .environmentObject(settings) .previewDisplayName("Game State") } } } Troubleshooting Steps Taken (No Success): Ensured correct placement of .environmentObject modifiers on subviews within the switch. Removed a previous .animation() modifier applied directly to the switch. Ensured state changes triggering transitions are wrapped in withAnimation. Wrapped the switch in a Group. Multiple "Clean Build Folder". Deleted entire Derived Data folder (with Xcode closed). Restarted Xcode and the Mac multiple times. Deleted and recreated ContentView.swift with the code above. Crucially: The errors persist even when replacing WelcomeView(), - - - --- SetupView(), and GameView() with simple Text("...") views inside the switch cases (as shown in the code snippet above). Environment: Xcode Version: newest macOS Version: newest Question: Does anyone have any idea why the compiler would still fail to type-check this switch structure, even when the views inside are simplified to basic Text? What else could I try to diagnose or fix this? Could it be related to the subviews (SetupView/GameView) potentially having their own NavigationView or complexity, even when replaced by Text in the failing ContentView? Thanks for any suggestions!
Topic: UI Frameworks SubTopic: SwiftUI
2
0
179
Apr ’25
Push Button captions not properly written to PDF document using PDFKit
The Problem Push buttons (created as a PDFAnnotation using PDFKit) do not properly write the associated caption's key-value pair (within the annotation's appearance characteristics dictionary) to a PDF document. What is Happening Push button widget annotations can have a caption that is displayed as the button’s label. In the PDF 1.7 specification (ISO PDF32000-2008, s. 12.5.6.19), a widget annotation can have an ‘appearance characteristics dictionary’ (MK) with properties to construct the appearance of the widget. The caption property (CA) is used to construct a button’s caption/label. PDFKit uses the PDFAnnotation .caption property to set the value of a push button’s caption as a string. Observation 1: In an open PDF document (using PDFView), a push button widget annotation can be created and added to a PDFPage using the following code: let pushButton = PDFAnnotation(bounds: pushButtonBounds, forType: .widget, withProperties: nil) pushButton.widgetFieldType = .button pushButton.widgetControlType = .pushButtonControl pushButton.caption = "My Button" page.addAnnotation(pushButton) The PDFAnnotation .caption property is used to set the caption to the required string. As a result, the push button is correctly displayed on the PDFPage with the correct label being display on the button. While the PDF document remains open, the appearance characteristics dictionary (an PDFAppearanceCharacteristics object) retains a key-value pair for the caption with the correct value as expected. On saving/writing to the PDF file, however, the key-value pair for the caption in the appearance characteristics dictionary is not written to the PDF document’s file. Resulting PDF markup: 6 0 obj << /Rect [ 256 299.8977 356 399.8977 ] /Border [ 0 0 0 ] /T (button23) /F 4 /Subtype /Widget /DA (/.AppleSystemUIFont 13 Tf 0 g) /MK 8 0 R /C [ 0 ] /AP 9 0 R /V /Off /M (D:20250330154918Z00'00') /FT /Btn /Type /Annot /Ff 65536 >> endobj 9 0 obj << /N 10 0 R >> endobj 8 0 obj << /BG [ 0.75 ] >> endobj 10 0 obj << /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [0 0 100 100] /Resources 11 0 R /Length 170 >> stream x }ê1 Ç0 Öw~≈ ahÈ KÈ q1q0\‚`ú Ÿ¿ 8¯Ôm% u0óª‰.Ô{yπ åP°H-}ª‡à y3 ¸ %≠¡‰ %› g¨$•µMVXø‡Hé†Ö ”î“¿˜® BI•L ˆ†b A pü‰Ã @ÓpB∫ †æœs ãÙ:d8Éwÿr»/}” €∂I÷Bõ B;'+gm Ô˝„ mÙ~ L*>• endstream endobj On closing the PDF document, the assigned value for the push button’s caption is not written to the file and is lost. Observation 2: On reopening the PDF document, and assigning a new value for the already-created push button’s caption, a key-value pair for the caption is again correctly added to the PDFAnnotation appearance characteristics dictionary. On saving/writing to the PDF file, this time, the caption key-value pair in the appearance characteristics dictionary is correctly written/saved to the PDF document file. Resulting PDF markup: 6 0 obj << /Border [ 0 0 0 ] /Rect [ 256 299.8977 356 399.8977 ] /T (button23) /F 4 /BS 8 0 R /Subtype /Widget /DA (/.AppleSystemUIFont 13 Tf 0 g) /MK 9 0 R /C [ 0 ] /AP 10 0 R /V /Off /M (D:20250330154918Z00'00') /FT /Btn /Type /Annot /Ff 65536 >> endobj 10 0 obj << /N 11 0 R >> endobj 9 0 obj << /BG [ 0.75 ] /CA (My Button) >> endobj 8 0 obj << /W 0 >> endobj 11 0 obj << /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [0 0 100 100] /Resources 12 0 R /Length 163 >> stream x uè1 ¬@ Ö˜˛ä7∂√]ì´◊Î≠ ¡A 8à”a∑Vj·ø˜jë™ !ÅÑ|y/=ˆËA1òʺ]pDá|=0¬“Œb ø+Õ gùf2E≤∞Ê≈N` û·Xm©-BãZ†H Ÿ ¿≈ºPÄ= Ø míãp •¡ ÈÓÅ˙>é “kó· Ÿb#—¬ Ûã¶2∂Ñ2fiΠ;óDÌiÓ?ü>LÁûÊy;} endstream endobj Impact on User Experience: Push button captions may not be properly saved to the PDF document’s file. This may result in an application redrawing a push button without a caption/label. More so, an application that uses the caption value to “read” a button’s label (e.g., for accessibility purposes) will not be able to do so.
1
0
114
Apr ’25
UIAlertController sometimes does not call its UIAlertAction handler
The iOS app that I’m helping to develop displays the following behavior, observed on an iPad Pro (4th generation) running iOS 18.1.1: The app uses UIAlertController to show an action sheet with two buttons (defined by two UIAlertAction objects). Each button has a handler block, and the first thing each handler does is to log that it was called. When the user taps one of the buttons and the action sheet disappears, most of the time the appropriate UIAlertAction handler is called. But sometimes there is no log entry for either of the action handlers, nor does the app do anything else associated with the chosen button, in which case I conclude that the handler was not called. I want to emphasize that I’m describing instances of the same action sheet displayed by the same code. Most of the time the appropriate button handler is called, but sometimes the handler is not called. The uncalled handler problem occurs about once per hour during normal use of the app. The problem has continued to occur across many weeks of testing. What could cause UIAlertController not to call its action handler?
Topic: UI Frameworks SubTopic: UIKit Tags:
6
0
151
Apr ’25
Why my app clips is Unavailable
My App Clip is associated with three domains: • nfc.ttwifi.net • qr.ttwifi.net Currently, I’m experiencing an issue where scanning a QR code from qr.ttwifi.net correctly launches my App Clip. However, when I scan a QR code from nfc.ttwifi.net, it successfully displays the App Clip card but then shows the message “App Clip unavailable.” I checked the Website Status in App Store Connect, and both domains have their Debugging Status and Cache Status marked as Verified. One important detail to note: Yesterday, while submitting a new version for review, I noticed that nfc.ttwifi.net showed “Unable to connect to AASA file” in the Cache Status in App Store Connect. The cache status update time was March 27, 2025, at 6:52 PM. However, when I checked today, both domains appeared to be fine, and the cache status update time was March 27, 2025, at 7:07 PM. How can I restore the App Clip functionality for my nfc.ttwifi.net domain?
6
0
251
Apr ’25
Live Activity resets to initial state after 8+ hours in background
Hi Apple team and community, We’re encountering a strange issue with Live Activity that seems related to memory management or background lifecycle. ❓ Issue: Our app updates a Live Activity regularly (every 3 minutes) using .update(...). However, after the app remains in the background for around 8 hours, the Live Activity reverts to the initial state that was passed into .request(...). Even though the app continues sending updates in the background, the UI on the Lock Screen and Dynamic Island resets to the original state.
0
0
76
Apr ’25
SIGTRAP Crash in QuartzCore/CALayer during UI Lifecycle Changes
Title: SIGTRAP Crash in QuartzCore/CALayer during UI Lifecycle Changes Description: My app is experiencing occasional crashes triggered by a SIGTRAP signal during UI transitions (e.g., scene lifecycle changes, animations). The crash occurs in QuartzCore/UIKitCore code paths, and no business logic appears in the stack trace. Crash Context: Crash occurs sporadically during UI state changes (e.g., app backgrounding, view transitions). Stack trace involves pthread_mutex_destroy, CA::Layer::commit_if_needed, and UIKit scene lifecycle methods. Full crash log snippet: Signal: SIGTRAP Thread 0 Crashed: 0 libsystem_platform.dylib 0x... [symbol: _platform_memset$VARIANT$Haswell] 2 libsystem_pthread.dylib pthread_mutex_destroy + 64 3 QuartzCore CA::Layer::commit_if_needed(...) 4 UIKitCore UIScenePerformActionsWithLifecycleActionMask + 112 5 CoreFoundation _CFXNotificationPost + 736 Suspected Causes: Threading Issue: Potential race condition in pthread_mutex destruction (e.g., mutex used after free). UI Operation on Background Thread: CALayer/UIKit operations not confined to the main thread. Lifecycle Mismatch: Scene/UI updates after deallocation (e.g., notifications triggering late UI changes). Troubleshooting Attempted: Enabled Zombie Objects – no obvious over-released objects detected. Thread Sanitizer shows no clear data races. Verified UIKit/CoreAnimation operations are dispatched to MainThread. Request for Guidance: Are there known issues with CA::Layer::commit_if_needed and scene lifecycle synchronization? How to debug SIGTRAP in system frameworks when no app code is in the stack? Recommended tools/approaches to isolate the mutex destruction issue.
Topic: UI Frameworks SubTopic: UIKit Tags:
0
1
141
Apr ’25
SwiftData document based on iOS18 shows blank screen
I have some apps using SwiftData document based. They work as expected under iOS17, but not under iOS18: install the app on a iPad 11 pro (first gen) from my MacBook open the app and open an existing fils (perfect under iOS17) it shows a blank, white screen, no data I can create a new document, blank screen, no data When I open that newly created file on a iOS 17 iPad pro, it works perfect, as expected The apps were created from scratch under macOS 14.7 with the corresponding Xcode/Swift/UI version. iOS devices under iOS17 Are there any known problems with document based SwiftData-apps under iOS18, are there any changes one has to made? Thank You so much for any help!
6
0
800
Apr ’25
Custom Trait with UITraitBridgedEnvironmentKey not writing back to UITraitCollection
Hello, In my SwiftUI App i'm trying to create a custom UI trait and a matching bridged SwiftUI environment key. I want to override the environment key in a swift view and then have that reflect in the current UITraitCollection. I'm following the pattern in the linked video but am not seeing the changes reflect in the current trait collection when I update the swift env value. I can't find anything online that is helping. Does anyone know what I am missing? https://developer.apple.com/videos/play/wwdc2023/10057/ // Setup enum CustomTheme: String, Codable { case theme1 = “theme1”, theme2 = “theme2” } struct customThemeTrait: UITraitDefinition { static let defaultValue = brand.theme1 static let affectsColorAppearance = true static let identifier = "com.appName.customTheme" } extension UITraitCollection { var customTheme: CustomTheme { self[customThemeTrait.self] } } extension UIMutableTraits { var customTheme: CustomTheme { get { self[customThemeTrait.self] } set { self[customThemeTrait.self] = newValue } } } private struct customThemeKey: EnvironmentKey { static let defaultValue: CustomTheme = .theme1 } extension customThemeKey: UITraitBridgedEnvironmentKey { static func read(from traitCollection: UITraitCollection) -> CustomTheme { traitCollection.customTheme } static func write(to mutableTraits: inout UIMutableTraits, value: CustomTheme) { mutableTraits.customTheme = value } } extension EnvironmentValues { var customTheme: CustomTheme { get { self[customThemeKey.self] } set { self[customThemeKey.self] = newValue } } } // Attempted Usage extension Color { static func primaryBackground() -> Color { UITraitCollection.current.customTheme == .theme1 ? Color.red : Color.blue } } struct ContentView: View { @State private var theme = .theme1 var body: some View { if (dataHasLoaded && themeIsSet) { HomeView() .environment(\.customTheme, theme) } else { SelectThemeView( theme: self.theme, setContentThemeHandler) } } func setContentThemeHandler(theme: customTheme) { self.theme = theme } } struct HomeView() { @Environment(\.customTheme) private var currentTheme: customTheme var body: some View { VStack { Text("currentTheme: \(currentTheme.rawValue)") .background(Color.primaryBackground()) Text("currentUITrait: \(UITraitCollection.current.customTheme.rawValue)") .background(Color.primaryBackground()) } } } OUTCOME: After selecting theme2 in the theme selector view and navigating to the homeView, the background is still red and the env and trait values print the following: currentTheme: theme2 currentUITrait: theme1 Can anyone help me identify what I am missing?
1
0
96
Apr ’25
NSTextView doesn't correctly redraw when deleting text and setting attribute at the same time
It seems that NSTextView has an issue with deleting text and setting any attribute at the same time, when it also has a textContainerInset. With the code below, after 1 second, the empty line in the text view is automatically deleted and the first line is colored red. The top part of the last line remains visible at its old position. Selecting the whole text and then deselecting it again makes the issue disappear. Is there a workaround? I've created FB16897003. class ViewController: NSViewController { @IBOutlet var textView: NSTextView! override func viewDidAppear() { textView.textContainerInset = CGSize(width: 0, height: 8) let _ = textView.layoutManager textView.textStorage!.setAttributedString(NSAttributedString(string: "1\n\n2\n3\n4")) textView.textStorage!.addAttribute(.foregroundColor, value: NSColor.labelColor, range: NSRange(location: 0, length: textView.textStorage!.length)) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [self] in textView.selectedRange = NSRange(location: 3, length: 0) textView.deleteBackward(nil) textView.textStorage!.beginEditing() textView.textStorage!.addAttribute(.foregroundColor, value: NSColor.red, range: NSRange(location: 0, length: 2)) textView.textStorage!.endEditing() } } }
5
0
313
Apr ’25
Crashes on iOS 18.4
We've seen a spike in crashes on iOS 18.4 across both iPhone & iPad. We can't reproduce it, but it looks like it happens when the app goes into the background. Crash Log
Replies
0
Boosts
0
Views
362
Activity
Mar ’25
UITextField The input space cursor is gone
UITextField The input space cursor is gone
Topic: UI Frameworks SubTopic: UIKit
Replies
2
Boosts
0
Views
55
Activity
Mar ’25
How to control when a DatePicker "pops up"
I have a Date field that holds the scheduled start date for an activity.. However, activities can be unscheduled (i.e., waiting to be scheduled at some other time). I want to use Date.distantFuture to indicate that the activity is unscheduled. Therefore I am looking to implement logic in my UI that looks something like @State private var showCalendar: Bool = false if date == .distantFuture { Button("unscheduled") { showCalendar.toggle() }.buttonStyle(.bordered) } else { DatePicker(section: $date) } .popover(isPresented: $showCalendar) { <use DatePicker Calendar view> } But this approach requires that I access the DataPicker's Calendar view and I don't know how to do that (and I don't ever what my users to see "Dec 31, 4000"). Any ideas? (BTW, I have a UIKit Calendar control I could use, but I'd prefer to use the standard control if possible.)
Replies
4
Boosts
0
Views
148
Activity
Mar ’25
Data Fetch issue from SensorKit
I want use SensorKit data for research purposes in my current app. I have applied for and received permission from Apple to access SensorKit Data. I have granting all the necessary permissions. But no data retrieved. I am using didCompleteFetch for retrieving data from Sensorkit. CompleteFetch method calls but find the data. Below is my SensorKitManager Code. import SensorKit import Foundation protocol SensorManagerDelegate: AnyObject { func didFetchPhoneUsageReport(_ reports: [SRPhoneUsageReport]) func didFetchAmbientLightSensorData(_ data: [SRAmbientLightSample]) func didFailFetchingData(error: Error) } class SensorManager: NSObject, SRSensorReaderDelegate { private let phoneUsageReader: SRSensorReader private let ambientLightReader: SRSensorReader weak var delegate: SensorManagerDelegate? override init() { self.phoneUsageReader = SRSensorReader(sensor: .phoneUsageReport) self.ambientLightReader = SRSensorReader(sensor: .ambientLightSensor) super.init() self.phoneUsageReader.delegate = self self.ambientLightReader.delegate = self } func requestAuthorization() { let sensors: Set<SRSensor> = [.phoneUsageReport, .ambientLightSensor] guard phoneUsageReader.authorizationStatus != .authorized || ambientLightReader.authorizationStatus != .authorized else { log("Already authorized. Fetching data directly...") fetchSensorData() return } SRSensorReader.requestAuthorization(sensors: sensors) { [weak self] error in DispatchQueue.main.async { if let error = error { self?.log("Authorization failed: \(error.localizedDescription)", isError: true) self?.delegate?.didFailFetchingData(error: error) } else { self?.log("Authorization granted.") self?.fetchSensorData() } } } } func fetchSensorData() { guard let fromDate = Calendar.current.date(byAdding: .day, value: -1, to: Date()) else { log("Failed to calculate 'from' date.", isError: true) return } let fromTime = SRAbsoluteTime.fromCFAbsoluteTime(_cf: fromDate.timeIntervalSinceReferenceDate) let toTime = SRAbsoluteTime.fromCFAbsoluteTime(_cf: Date().timeIntervalSinceReferenceDate) let phoneUsageRequest = SRFetchRequest() phoneUsageRequest.from = fromTime phoneUsageRequest.to = toTime phoneUsageRequest.device = SRDevice.current let ambientLightRequest = SRFetchRequest() ambientLightRequest.from = fromTime ambientLightRequest.to = toTime ambientLightRequest.device = SRDevice.current phoneUsageReader.fetch(phoneUsageRequest) ambientLightReader.fetch(ambientLightRequest) } // ✅ Delegate Methods func sensorReader(_ reader: SRSensorReader, didCompleteFetch fetchRequest: SRFetchRequest) { Task.detached { if reader.sensor == .phoneUsageReport { if let samples = reader.fetch(fetchRequest) as? [SRPhoneUsageReport] { DispatchQueue.main.async { [weak self] in self?.delegate?.didFetchPhoneUsageReport(samples) } } } else if reader.sensor == .ambientLightSensor { if let samples = reader.fetch(fetchRequest) as? [SRAmbientLightSample] { DispatchQueue.main.async { [weak self] in self?.delegate?.didFetchAmbientLightSensorData(samples) } } } } } func sensorReader(_ reader: SRSensorReader, fetching fetchRequest: SRFetchRequest, didFetchResult result: SRFetchResult<AnyObject>) -> Bool { return true } func sensorReader(_ reader: SRSensorReader, fetching fetchRequest: SRFetchRequest, failedWithError error: any Error) { DispatchQueue.main.async { [weak self] in self?.delegate?.didFailFetchingData(error: error) } } // MARK: - Logging Helper private func log(_ message: String, isError: Bool = false) { if isError { print("❌ [SensorManager] \(message)") } else { print("✅ [SensorManager] \(message)") } } } And ViewController import UIKit import SensorKit class ViewController: UIViewController { private var sensorManager: SensorManager! override func viewDidLoad() { super.viewDidLoad() setupSensorManager() } private func setupSensorManager() { sensorManager = SensorManager() sensorManager.delegate = self sensorManager.requestAuthorization() } } // MARK: - SensorManagerDelegate extension ViewController: SensorManagerDelegate { func didFetchPhoneUsageReport(_ reports: [SRPhoneUsageReport]) { for report in reports { print("Total Calls: (report.totalOutgoingCalls + report.totalIncomingCalls)") print("Outgoing Calls: (report.totalOutgoingCalls)") print("Incoming Calls: (report.totalIncomingCalls)") print("Total Call Duration: (report.totalPhoneCallDuration) seconds") } } func didFetchAmbientLightSensorData(_ data: [SRAmbientLightSample]) { for sample in data { print(sample) } } func didFailFetchingData(error: Error) { print("Failed to fetch data: \(error.localizedDescription)") } } Could anyone please assist me in resolving this issue? Any guidance or troubleshooting steps would be greatly appreciated.
Replies
0
Boosts
0
Views
179
Activity
Mar ’25
WKWebview/UIViewRepresentable - Hide Loading... text while webview is loading
I have the following UIViewRepresentable that loads a webview. struct SViewerWebView: UIViewRepresentable{ var url: String var token: String @Binding var isLoading: Bool func makeCoordinator() -> Coordinator { Coordinator(self) } func makeUIView(context: Context) -> WKWebView { let webConfiguration = WKWebViewConfiguration() let webView = WKWebView(frame:.zero,configuration:webConfiguration) webView.allowsBackForwardNavigationGestures = true webView.isInspectable = true webView.navigationDelegate = context.coordinator return webView } func updateUIView(_ uiView: WKWebView, context: Context) { guard let urlforRequest = URL(string: url) else { print("❌ Invalid URL:", url) return } var request = URLRequest(url: urlforRequest) request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization") print("🔄 Loading URL:", url) print("🛠 Headers:", request.allHTTPHeaderFields ?? [:]) uiView.load(request) } //coordinator class Coordinator: NSObject, WKNavigationDelegate { var parent: SViewerWebView init(_ parent: SViewerWebView) { self.parent = parent } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { DispatchQueue.main.async { self.parent.isLoading = false // Hide loading when page loads } } func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { DispatchQueue.main.async { self.parent.isLoading = false // Hide loading on error } } } } This is the state before the content loads. At this point a ProgressView() is displayed: The problem comes in the step between screenshot 1 and 3: as you can see in below pictures, before navigating to the webview content, there is a default loading text that still showing up. Apparently, it seems to be the default behavior from the wkwebview. How can I hide that text status? my view component: var body: some View { ZStack{ SViewerWebView(url: webUrl,token: TokenManager.getToken()!,isLoading: $isLoading) if isLoading{ VStack { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .scaleEffect(1.5) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } } .ignoresSafeArea() }
Topic: UI Frameworks SubTopic: SwiftUI
Replies
1
Boosts
0
Views
85
Activity
Mar ’25
Avoiding logoff when installing new/modified InputMethodKit input source
It appears that on all recent versions of macOS when adding a new InputSource in /Library/Input Methods (or modifying an existing one there) the user needs to logoff and log back in in order for Keyboard/Input Sources in System Settings and Input Menu in menu bar to pick up the changes. Is there a way to avoid this? That is, some notification to send or API to call to tell both of these "hey, things might have changed on disk, please re-read the info, and update the UI". 🙂
Replies
1
Boosts
0
Views
290
Activity
Mar ’25
How to add more padding bellow a TextView when the keyboard is shown
When i have TextField inside ScrollView and tap on it the keyboard is shown as expected. But it seems that the TextField is moved up just enough to show the input area but i want to be moved enough so that is visible in its whole. Otherwise it looks cropped. I couldn't find a way to change this behaviour. struct ContentView: View {   @State var text:String = ""   var body: some View {     ScrollView {       VStack(spacing: 10) {         ForEach(1...12, id: \.self) {           Text("\($0)…")             .frame(height:50)         }         TextField("Label..", text: self.$text)           .padding(10)           .background(.white)           .cornerRadius(10)           .overlay(             RoundedRectangle(cornerRadius: 10)               .stroke(.blue, lineWidth: 1)           )       }       .padding()       .background(.red)     }   }     }
Replies
4
Boosts
3
Views
4k
Activity
Mar ’25
SwiftUI List DisclosureGroup Rendering Issues on macOS 13 & 14
Issue Description Whenever the first item in the List is a DisclosureGroup, all subsequent disclosure groups work fine. However, if the first item is not a disclosure group, the disclosure groups in subsequent items do not render correctly. This issue does not occur in macOS 15, where everything works as expected. Has anyone else encountered this behavior, or does anyone have a workaround for macOS 13 & 14? I’m not using OutlineGroup because I need to bind to an isExpanded property for each row in the list. Reproduction Steps I’ve created a small test project to illustrate the issue: Press “Insert item at top” to add a non-disclosure item at the start of the list. Then, press “Append item with sub-item” to add a disclosure group further down. The disclosure group does not display correctly. The label of the disclosure group renders fine, but the content of the disclosure group does not display at all. Press "Insert item at top with sub-item" and the list displays as expected. Build Environment macOS 15.3.2 (24D81) Xcode Version 16.2 (16C5032a) Issue Observed macOS 13 & 14 (bug occurs) macOS 15 (works correctly) Sample Code import SwiftUI class ListItem: ObservableObject, Hashable, Identifiable { var id = UUID() @Published var name: String @Published var subItems: [ListItem]? @Published var isExpanded: Bool = true init( name: String, subjobs: [ListItem]? = nil ) { self.name = name self.subItems = subjobs } static func == (lhs: ListItem, rhs: ListItem) -> Bool { lhs.id == rhs.id } func hash(into hasher: inout Hasher) { hasher.combine(id) } } struct ContentView: View { @State private var listItems: [ListItem] = [] @State private var selectedJob: ListItem? @State private var redraw: Int = 0 var body: some View { VStack { List(selection: $selectedJob) { ForEach(self.listItems, id: \.id) { job in self.itemRowView(for: job) } } .id(redraw) Button("Insert item at top") { self.listItems.insert( ListItem( name: "List item \(listItems.count)" ), at: 0 ) } Button("Insert item at top with sub-item") { self.listItems.insert( ListItem( name: "List item \(listItems.count)", subjobs: [ListItem(name: "Sub-item")] ), at: 0 ) } Button("Append item") { self.listItems.append( ListItem( name: "List item \(listItems.count)" ) ) } Button("Append item with sub-item") { self.listItems.append( ListItem( name: "List item \(listItems.count)", subjobs: [ListItem(name: "Sub-item")] ) ) } Button("Clear") { self.listItems.removeAll() } Button("Redraw") { self.redraw += 1 } } } @ViewBuilder private func itemRowView(for job: ListItem) -> some View { if job.subItems == nil { self.itemLabelView(for: job) } else { AnyView( erasing: ListItemDisclosureGroup(job: job) { self.itemLabelView(for: job) } jobRowView: { child in self.itemRowView(for: child) } ) } } @ViewBuilder private func itemLabelView(for job: ListItem) -> some View { Text(job.name) } struct ListItemDisclosureGroup<LabelView: View, RowView: View>: View { @ObservedObject var job: ListItem @ViewBuilder let labelView: () -> LabelView @ViewBuilder let jobRowView: (ListItem) -> RowView var body: some View { DisclosureGroup(isExpanded: $job.isExpanded) { if let children = job.subItems { ForEach(children, id: \.id) { child in self.jobRowView(child) } } } label: { self.labelView() } } } }
Replies
1
Boosts
0
Views
78
Activity
Mar ’25
CoreText' CTRunDraw can't draw underline attribute in iOS18 with Xcode 16 beta
demo code : - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // Flip the coordinate system CGContextSetTextMatrix(context, CGAffineTransformIdentity); CGContextTranslateCTM(context, 0, self.bounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); NSDictionary *attrs = @{NSFontAttributeName: [UIFont systemFontOfSize:20], NSForegroundColorAttributeName: [UIColor blueColor], NSUnderlineStyleAttributeName: @(NSUnderlineStyleThick), }; // Make an attributed string NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Hello CoreText!" attributes:attrs]; CFAttributedStringRef attributedStringRef = (__bridge CFAttributedStringRef)attributedString; // Simple CoreText with CTFrameDraw CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attributedStringRef); CGPathRef path = CGPathCreateWithRect(self.bounds,NULL); CTFrameRef frame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0),path,NULL); //CTFrameDraw(frame, context); // You can comment the line 'CTFrameDraw' and use the following lines // draw with CTLineDraw CFArrayRef lines = CTFrameGetLines(frame); CGPoint lineOrigins[CFArrayGetCount(lines)]; CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), lineOrigins); for (int i = 0; i < CFArrayGetCount(lines); i++) { CTLineRef line = CFArrayGetValueAtIndex(lines, i); CGContextSetTextPosition(context, lineOrigins[i].x, lineOrigins[i].y); // CTLineDraw(line, context); // You can comment the line 'CTLineDraw' and use the following lines // draw with CTRunDraw // use CTRunDraw will lost some attributes like NSUnderlineStyleAttributeName, // so you need draw it by yourself CFArrayRef runs = CTLineGetGlyphRuns(line); for (int j = 0; j < CFArrayGetCount(runs); j++) { CTRunRef run = CFArrayGetValueAtIndex(runs, j); CTRunDraw(run, context, CFRangeMake(0, 0)); } } } this code will use CTRunDraw to draw the content , and the underline will draw and show normally in iOS17 & Xcode 15 , But when you build it with XCode16 & iOS18 beta . the underline will be missing .
Replies
2
Boosts
4
Views
762
Activity
Apr ’25
Persistent 'buildExpression unavailable' error in ContentView with switch/AppState
Hi everyone, I'm encountering a persistent build error in a SwiftUI iOS app and I'm running out of ideas. Setup: My ContentView uses two @EnvironmentObjects (GameViewModel, SettingsStore). The GameViewModel has an AppState enum (.welcome, .setup, .game). The ContentView body uses a switch viewModel.currentAppState (wrapped in a Group) to display one of three different views (WelcomeView, SetupView, GameView). Navigation between states is triggered by changing viewModel.currentAppState within withAnimation blocks in the respective subviews. Problem: I consistently get the build error 'buildExpression' is unavailable: this expression does not conform to 'View' pointing to the lines inside the .setup and .game cases of the switch statement in ContentView. Code (ContentView.swift - Simplified Test Version that STILL fails): // Zweck: Steuert die Hauptnavigation basierend auf AppState // KORRIGIERTE VERSION OHNE .animation(...) am Ende import SwiftUI struct ContentView: View { // Zugriff auf das ViewModel, um den AppState zu lesen @EnvironmentObject var viewModel: GameViewModel // SettingsStore wird von untergeordneten Views benötigt @EnvironmentObject var settingsStore: SettingsStore var body: some View { // Optional: Group um das switch-Statement, kann manchmal helfen (kannst du auch weglassen) Group { // Wechsle die Ansicht basierend auf viewModel.currentAppState switch viewModel.currentAppState { case .welcome: WelcomeView() // EnvironmentObjects an WelcomeView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.opacity) case .setup: SetupView() // EnvironmentObjects an SetupView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading))) case .game: GameView() // EnvironmentObjects an GameView übergeben .environmentObject(viewModel) .environmentObject(settingsStore) // Übergangsanimation .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading))) } } // Ende der optionalen Group // !!! WICHTIG: KEIN .animation(...) Modifier hier !!! } } // Vorschau struct ContentView_Previews: PreviewProvider { static var previews: some View { // Erstelle Instanzen für die Vorschau let vmWelcome = GameViewModel() vmWelcome.currentAppState = .welcome let vmSetup = GameViewModel() vmSetup.currentAppState = .setup let vmGame = GameViewModel() vmGame.currentAppState = .game vmGame.currentCard = Card.defaultCards.first let settings = SettingsStore() // Zeige verschiedene Zustände in der Vorschau an Group { ContentView() .environmentObject(vmWelcome) .environmentObject(settings) .previewDisplayName("Welcome State") ContentView() .environmentObject(vmSetup) .environmentObject(settings) .previewDisplayName("Setup State") ContentView() .environmentObject(vmGame) .environmentObject(settings) .previewDisplayName("Game State") } } } Troubleshooting Steps Taken (No Success): Ensured correct placement of .environmentObject modifiers on subviews within the switch. Removed a previous .animation() modifier applied directly to the switch. Ensured state changes triggering transitions are wrapped in withAnimation. Wrapped the switch in a Group. Multiple "Clean Build Folder". Deleted entire Derived Data folder (with Xcode closed). Restarted Xcode and the Mac multiple times. Deleted and recreated ContentView.swift with the code above. Crucially: The errors persist even when replacing WelcomeView(), - - - --- SetupView(), and GameView() with simple Text("...") views inside the switch cases (as shown in the code snippet above). Environment: Xcode Version: newest macOS Version: newest Question: Does anyone have any idea why the compiler would still fail to type-check this switch structure, even when the views inside are simplified to basic Text? What else could I try to diagnose or fix this? Could it be related to the subviews (SetupView/GameView) potentially having their own NavigationView or complexity, even when replaced by Text in the failing ContentView? Thanks for any suggestions!
Topic: UI Frameworks SubTopic: SwiftUI
Replies
2
Boosts
0
Views
179
Activity
Apr ’25
Push Button captions not properly written to PDF document using PDFKit
The Problem Push buttons (created as a PDFAnnotation using PDFKit) do not properly write the associated caption's key-value pair (within the annotation's appearance characteristics dictionary) to a PDF document. What is Happening Push button widget annotations can have a caption that is displayed as the button’s label. In the PDF 1.7 specification (ISO PDF32000-2008, s. 12.5.6.19), a widget annotation can have an ‘appearance characteristics dictionary’ (MK) with properties to construct the appearance of the widget. The caption property (CA) is used to construct a button’s caption/label. PDFKit uses the PDFAnnotation .caption property to set the value of a push button’s caption as a string. Observation 1: In an open PDF document (using PDFView), a push button widget annotation can be created and added to a PDFPage using the following code: let pushButton = PDFAnnotation(bounds: pushButtonBounds, forType: .widget, withProperties: nil) pushButton.widgetFieldType = .button pushButton.widgetControlType = .pushButtonControl pushButton.caption = "My Button" page.addAnnotation(pushButton) The PDFAnnotation .caption property is used to set the caption to the required string. As a result, the push button is correctly displayed on the PDFPage with the correct label being display on the button. While the PDF document remains open, the appearance characteristics dictionary (an PDFAppearanceCharacteristics object) retains a key-value pair for the caption with the correct value as expected. On saving/writing to the PDF file, however, the key-value pair for the caption in the appearance characteristics dictionary is not written to the PDF document’s file. Resulting PDF markup: 6 0 obj << /Rect [ 256 299.8977 356 399.8977 ] /Border [ 0 0 0 ] /T (button23) /F 4 /Subtype /Widget /DA (/.AppleSystemUIFont 13 Tf 0 g) /MK 8 0 R /C [ 0 ] /AP 9 0 R /V /Off /M (D:20250330154918Z00'00') /FT /Btn /Type /Annot /Ff 65536 >> endobj 9 0 obj << /N 10 0 R >> endobj 8 0 obj << /BG [ 0.75 ] >> endobj 10 0 obj << /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [0 0 100 100] /Resources 11 0 R /Length 170 >> stream x }ê1 Ç0 Öw~≈ ahÈ KÈ q1q0\‚`ú Ÿ¿ 8¯Ôm% u0óª‰.Ô{yπ åP°H-}ª‡à y3 ¸ %≠¡‰ %› g¨$•µMVXø‡Hé†Ö ”î“¿˜® BI•L ˆ†b A pü‰Ã @ÓpB∫ †æœs ãÙ:d8Éwÿr»/}” €∂I÷Bõ B;'+gm Ô˝„ mÙ~ L*>• endstream endobj On closing the PDF document, the assigned value for the push button’s caption is not written to the file and is lost. Observation 2: On reopening the PDF document, and assigning a new value for the already-created push button’s caption, a key-value pair for the caption is again correctly added to the PDFAnnotation appearance characteristics dictionary. On saving/writing to the PDF file, this time, the caption key-value pair in the appearance characteristics dictionary is correctly written/saved to the PDF document file. Resulting PDF markup: 6 0 obj << /Border [ 0 0 0 ] /Rect [ 256 299.8977 356 399.8977 ] /T (button23) /F 4 /BS 8 0 R /Subtype /Widget /DA (/.AppleSystemUIFont 13 Tf 0 g) /MK 9 0 R /C [ 0 ] /AP 10 0 R /V /Off /M (D:20250330154918Z00'00') /FT /Btn /Type /Annot /Ff 65536 >> endobj 10 0 obj << /N 11 0 R >> endobj 9 0 obj << /BG [ 0.75 ] /CA (My Button) >> endobj 8 0 obj << /W 0 >> endobj 11 0 obj << /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [0 0 100 100] /Resources 12 0 R /Length 163 >> stream x uè1 ¬@ Ö˜˛ä7∂√]ì´◊Î≠ ¡A 8à”a∑Vj·ø˜jë™ !ÅÑ|y/=ˆËA1òʺ]pDá|=0¬“Œb ø+Õ gùf2E≤∞Ê≈N` û·Xm©-BãZ†H Ÿ ¿≈ºPÄ= Ø míãp •¡ ÈÓÅ˙>é “kó· Ÿb#—¬ Ûã¶2∂Ñ2fiΠ;óDÌiÓ?ü>LÁûÊy;} endstream endobj Impact on User Experience: Push button captions may not be properly saved to the PDF document’s file. This may result in an application redrawing a push button without a caption/label. More so, an application that uses the caption value to “read” a button’s label (e.g., for accessibility purposes) will not be able to do so.
Replies
1
Boosts
0
Views
114
Activity
Apr ’25
UIAlertController sometimes does not call its UIAlertAction handler
The iOS app that I’m helping to develop displays the following behavior, observed on an iPad Pro (4th generation) running iOS 18.1.1: The app uses UIAlertController to show an action sheet with two buttons (defined by two UIAlertAction objects). Each button has a handler block, and the first thing each handler does is to log that it was called. When the user taps one of the buttons and the action sheet disappears, most of the time the appropriate UIAlertAction handler is called. But sometimes there is no log entry for either of the action handlers, nor does the app do anything else associated with the chosen button, in which case I conclude that the handler was not called. I want to emphasize that I’m describing instances of the same action sheet displayed by the same code. Most of the time the appropriate button handler is called, but sometimes the handler is not called. The uncalled handler problem occurs about once per hour during normal use of the app. The problem has continued to occur across many weeks of testing. What could cause UIAlertController not to call its action handler?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
6
Boosts
0
Views
151
Activity
Apr ’25
Why my app clips is Unavailable
My App Clip is associated with three domains: • nfc.ttwifi.net • qr.ttwifi.net Currently, I’m experiencing an issue where scanning a QR code from qr.ttwifi.net correctly launches my App Clip. However, when I scan a QR code from nfc.ttwifi.net, it successfully displays the App Clip card but then shows the message “App Clip unavailable.” I checked the Website Status in App Store Connect, and both domains have their Debugging Status and Cache Status marked as Verified. One important detail to note: Yesterday, while submitting a new version for review, I noticed that nfc.ttwifi.net showed “Unable to connect to AASA file” in the Cache Status in App Store Connect. The cache status update time was March 27, 2025, at 6:52 PM. However, when I checked today, both domains appeared to be fine, and the cache status update time was March 27, 2025, at 7:07 PM. How can I restore the App Clip functionality for my nfc.ttwifi.net domain?
Replies
6
Boosts
0
Views
251
Activity
Apr ’25
Battery level getting from UIDevice is not accurate on iOS17
On iOS17, UIDevice.current.batteryLevel is returning values rounded to 0.05, such as 1, 0.95, 0.9. Which used to be a 1% granularity in iOS16. Is this a bug or a new feature?
Replies
18
Boosts
12
Views
5.6k
Activity
Apr ’25
How to program globe keys on the keyboard
How should I program the globe key? If possible, could you teach me in C language?
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
54
Activity
Apr ’25
Live Activity resets to initial state after 8+ hours in background
Hi Apple team and community, We’re encountering a strange issue with Live Activity that seems related to memory management or background lifecycle. ❓ Issue: Our app updates a Live Activity regularly (every 3 minutes) using .update(...). However, after the app remains in the background for around 8 hours, the Live Activity reverts to the initial state that was passed into .request(...). Even though the app continues sending updates in the background, the UI on the Lock Screen and Dynamic Island resets to the original state.
Replies
0
Boosts
0
Views
76
Activity
Apr ’25
SIGTRAP Crash in QuartzCore/CALayer during UI Lifecycle Changes
Title: SIGTRAP Crash in QuartzCore/CALayer during UI Lifecycle Changes Description: My app is experiencing occasional crashes triggered by a SIGTRAP signal during UI transitions (e.g., scene lifecycle changes, animations). The crash occurs in QuartzCore/UIKitCore code paths, and no business logic appears in the stack trace. Crash Context: Crash occurs sporadically during UI state changes (e.g., app backgrounding, view transitions). Stack trace involves pthread_mutex_destroy, CA::Layer::commit_if_needed, and UIKit scene lifecycle methods. Full crash log snippet: Signal: SIGTRAP Thread 0 Crashed: 0 libsystem_platform.dylib 0x... [symbol: _platform_memset$VARIANT$Haswell] 2 libsystem_pthread.dylib pthread_mutex_destroy + 64 3 QuartzCore CA::Layer::commit_if_needed(...) 4 UIKitCore UIScenePerformActionsWithLifecycleActionMask + 112 5 CoreFoundation _CFXNotificationPost + 736 Suspected Causes: Threading Issue: Potential race condition in pthread_mutex destruction (e.g., mutex used after free). UI Operation on Background Thread: CALayer/UIKit operations not confined to the main thread. Lifecycle Mismatch: Scene/UI updates after deallocation (e.g., notifications triggering late UI changes). Troubleshooting Attempted: Enabled Zombie Objects – no obvious over-released objects detected. Thread Sanitizer shows no clear data races. Verified UIKit/CoreAnimation operations are dispatched to MainThread. Request for Guidance: Are there known issues with CA::Layer::commit_if_needed and scene lifecycle synchronization? How to debug SIGTRAP in system frameworks when no app code is in the stack? Recommended tools/approaches to isolate the mutex destruction issue.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
0
Boosts
1
Views
141
Activity
Apr ’25
SwiftData document based on iOS18 shows blank screen
I have some apps using SwiftData document based. They work as expected under iOS17, but not under iOS18: install the app on a iPad 11 pro (first gen) from my MacBook open the app and open an existing fils (perfect under iOS17) it shows a blank, white screen, no data I can create a new document, blank screen, no data When I open that newly created file on a iOS 17 iPad pro, it works perfect, as expected The apps were created from scratch under macOS 14.7 with the corresponding Xcode/Swift/UI version. iOS devices under iOS17 Are there any known problems with document based SwiftData-apps under iOS18, are there any changes one has to made? Thank You so much for any help!
Replies
6
Boosts
0
Views
800
Activity
Apr ’25
Custom Trait with UITraitBridgedEnvironmentKey not writing back to UITraitCollection
Hello, In my SwiftUI App i'm trying to create a custom UI trait and a matching bridged SwiftUI environment key. I want to override the environment key in a swift view and then have that reflect in the current UITraitCollection. I'm following the pattern in the linked video but am not seeing the changes reflect in the current trait collection when I update the swift env value. I can't find anything online that is helping. Does anyone know what I am missing? https://developer.apple.com/videos/play/wwdc2023/10057/ // Setup enum CustomTheme: String, Codable { case theme1 = “theme1”, theme2 = “theme2” } struct customThemeTrait: UITraitDefinition { static let defaultValue = brand.theme1 static let affectsColorAppearance = true static let identifier = "com.appName.customTheme" } extension UITraitCollection { var customTheme: CustomTheme { self[customThemeTrait.self] } } extension UIMutableTraits { var customTheme: CustomTheme { get { self[customThemeTrait.self] } set { self[customThemeTrait.self] = newValue } } } private struct customThemeKey: EnvironmentKey { static let defaultValue: CustomTheme = .theme1 } extension customThemeKey: UITraitBridgedEnvironmentKey { static func read(from traitCollection: UITraitCollection) -> CustomTheme { traitCollection.customTheme } static func write(to mutableTraits: inout UIMutableTraits, value: CustomTheme) { mutableTraits.customTheme = value } } extension EnvironmentValues { var customTheme: CustomTheme { get { self[customThemeKey.self] } set { self[customThemeKey.self] = newValue } } } // Attempted Usage extension Color { static func primaryBackground() -> Color { UITraitCollection.current.customTheme == .theme1 ? Color.red : Color.blue } } struct ContentView: View { @State private var theme = .theme1 var body: some View { if (dataHasLoaded && themeIsSet) { HomeView() .environment(\.customTheme, theme) } else { SelectThemeView( theme: self.theme, setContentThemeHandler) } } func setContentThemeHandler(theme: customTheme) { self.theme = theme } } struct HomeView() { @Environment(\.customTheme) private var currentTheme: customTheme var body: some View { VStack { Text("currentTheme: \(currentTheme.rawValue)") .background(Color.primaryBackground()) Text("currentUITrait: \(UITraitCollection.current.customTheme.rawValue)") .background(Color.primaryBackground()) } } } OUTCOME: After selecting theme2 in the theme selector view and navigating to the homeView, the background is still red and the env and trait values print the following: currentTheme: theme2 currentUITrait: theme1 Can anyone help me identify what I am missing?
Replies
1
Boosts
0
Views
96
Activity
Apr ’25
NSTextView doesn't correctly redraw when deleting text and setting attribute at the same time
It seems that NSTextView has an issue with deleting text and setting any attribute at the same time, when it also has a textContainerInset. With the code below, after 1 second, the empty line in the text view is automatically deleted and the first line is colored red. The top part of the last line remains visible at its old position. Selecting the whole text and then deselecting it again makes the issue disappear. Is there a workaround? I've created FB16897003. class ViewController: NSViewController { @IBOutlet var textView: NSTextView! override func viewDidAppear() { textView.textContainerInset = CGSize(width: 0, height: 8) let _ = textView.layoutManager textView.textStorage!.setAttributedString(NSAttributedString(string: "1\n\n2\n3\n4")) textView.textStorage!.addAttribute(.foregroundColor, value: NSColor.labelColor, range: NSRange(location: 0, length: textView.textStorage!.length)) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [self] in textView.selectedRange = NSRange(location: 3, length: 0) textView.deleteBackward(nil) textView.textStorage!.beginEditing() textView.textStorage!.addAttribute(.foregroundColor, value: NSColor.red, range: NSRange(location: 0, length: 2)) textView.textStorage!.endEditing() } } }
Replies
5
Boosts
0
Views
313
Activity
Apr ’25