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 do I use "views" and structures / what's wrong with my code?
what's wrong with my code? im getting error "Closure containing control flow statement cannot be used with result builder 'ViewBuilder' " next to my for loop... // // ContentView.swift // Bouncing Balls Simulation without ChatGPT's Code // // Created by Hillary Basile on 3/30/25. // import SwiftUI import Foundation import CoreGraphics class Balls { //var color: String var xPosition: Int var yPosition: Int var xVelocity: Int var yVelocity: Int var radius: Int var gravity: CGFloat var restitution: Int var other: Balls? init(xPosition: Int, yPosition: Int, xVelocity: Int, yVelocity: Int, radius: Int, gravity: CGFloat, restitution: Int) //ADD COLOR { //self.color = color self.xPosition = xPosition self.yPosition = yPosition self.xVelocity = xVelocity self.yVelocity = yVelocity self.radius = radius self.gravity = gravity self.restitution = restitution } let ball1: Balls = Balls (xPosition: 100, yPosition: 100, xVelocity: 3, yVelocity: 0, radius: 3, gravity: 0.3, restitution: 1) let ball2: Balls = Balls (xPosition: 200, yPosition: 50, xVelocity: -2, yVelocity: 2, radius: 3, gravity: 0.3, restitution: 1) let ball3: Balls = Balls (xPosition: 300, yPosition: 150, xVelocity: 4, yVelocity: -3, radius: 3, gravity: 0.3, restitution: 1) struct UserView: View { var timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect() var body: some View { VStack { //Background color Color.gray.edgesIgnoringSafeArea(.all) //var balls [Int] = [ball1; ball2; ball3] for item in Balls { Circle() .fill(Color.black) .frame(width: 50, height: 50) .position(Balls[].xPosition, Balls[].yPosition) .onReceive(timer) { self.yVelocity += self.gravity self.xPosition = CGPoint(self.xPosition + self.xVelocity) self .yPosition = CGPoint (self.yPosition + self.yVelocity) if self.yPosition >= 500 - 25 { self.yPosition = 500 - 25 self.yVelocity = -self.yVelocity * self.restitution } if self.xPosition <= 25 { self.xPosition = 25 self.xVelocity = -self.xVelocity } if self.xPosition >= 375 { self.xPosition = 375 self .xVelocity = -self.velocityX } let dx: int = other.xPosition - self.xPosition let dy: int = other.yPosition - self.yPosition let distance: int = sqrt (dx * dx + dy * dy) if distance < self.radius + other.radius { self.xVelocity = -self.xVelocity * self.restitution self.yVelocity = -self.yVelocity * self.restitution other.xVelocity = -other.xVelocity * self.restitution other.yVelocity = -other.yVelocity * self.restitution } } } } } } } } #Preview { ContentView() } }
Topic: UI Frameworks SubTopic: SwiftUI
5
0
159
Apr ’25
Reading large documents
Can the SwiftUI document architecture Take a file as read-only; never to be written out Take files too large for memory (multi-MB, or even GB) I wouldn't want the system to read a gigabyte size file into memory by default. If the system can use a memory-mapped Data as the representation, that'll be something I can make do. It would be even better if I could tell the system that I'll handle all the reading, all I need from it is a reference to the file's location on disk.
Topic: UI Frameworks SubTopic: SwiftUI
0
0
53
Apr ’25
UIScrollView in UIViewControllerRepresentable - UI freezes when content touches bottom SafeArea
The SwiftUI ScrollView lacks some features I need and so I created a custom MyScrollView based on UIScrollView wrapped within a UIViewControllerRepresentable. While this works fine in general I know came across a very strange problem: When MyScrollView is used in a sheet and its content touches bottom SafeArea, the UI freezes as soon as the should be displayed. The code below shows the problem as well in preview as on the simulator and on devices. Please note that the code is tuned do the display size of an iPhone 16 Pro. When running on different devices one might need to adjust height of the Color.yellow. In the demo code the UI freezes if the Color.yellow has a height between 738 to 771 pixels. Every other height is fine. Is there something wrong with my implementation of MyScrollView? When using ScrollView instead, everything works fine. Code: struct ContentView: View { @State private var showSheet: Bool = false var body: some View { ZStack { Button("Show Sheet") { showSheet = true } } .sheet(isPresented: $showSheet) { VStack { Text("Some Header Content") MyScrollView { VStack { Color.yellow //.frame(height: 737) // works .frame(height: 738) // does NOT works // ... //.frame(height: 771) // does NOT works //.frame(height: 772) // works } } .ignoresSafeArea() } } } } struct MyScrollView<Content: View>: UIViewControllerRepresentable { let content: Content init(@ViewBuilder content: () -> Content) { self.content = content() } func makeUIViewController(context: Context) -> UIViewController { let scrollViewVC = UIViewController() scrollViewVC.view.backgroundColor = .clear let scrollView = UIScrollView() scrollView.backgroundColor = .clear let contentVC = UIHostingController(rootView: self.content) contentVC.view.backgroundColor = .clear context.coordinator.contentVC = contentVC context.coordinator.scrollView = scrollView scrollView.translatesAutoresizingMaskIntoConstraints = false scrollViewVC.view.addSubview(scrollView) NSLayoutConstraint.activate([ scrollView.topAnchor.constraint(equalTo: scrollViewVC.view.topAnchor), scrollView.bottomAnchor.constraint(equalTo: scrollViewVC.view.bottomAnchor), scrollView.leadingAnchor.constraint(equalTo: scrollViewVC.view.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: scrollViewVC.view.trailingAnchor) ]) contentVC.willMove(toParent: scrollViewVC) scrollViewVC.addChild(contentVC) contentVC.view.translatesAutoresizingMaskIntoConstraints = false scrollView.addSubview(contentVC.view) NSLayoutConstraint.activate([ contentVC.view.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor), contentVC.view.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor), contentVC.view.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), contentVC.view.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), contentVC.view.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor) ]) contentVC.didMove(toParent: scrollViewVC) return scrollViewVC } func updateUIViewController(_ uiViewController: UIViewController, context: Context) { context.coordinator.contentVC?.rootView = content } func makeCoordinator() -> Coordinator { return Coordinator() } class Coordinator { var contentVC: UIHostingController<Content>? var scrollView: UIScrollView? init() { //... } } } #Preview { ContentView() }
Topic: UI Frameworks SubTopic: SwiftUI
2
0
115
Apr ’25
Access DocumentGroup container by external WindowGroup
Hi, I am currently developing a document-based application for macOS and have encountered a challenge related to document container management. Specifically, I need to open a windowGroup that shares the same container as the one used in the DocumentGroup. However, my current approach of using a global shared model container has led to unintended behavior: any new document created is linked to existing ones, and changes made in one document are reflected across all documents. To address this issue, I am looking for a solution that allows each newly created document to be individualized while still sharing the document container with all relevant WindowGroups that require access to the data it holds. I would greatly appreciate any insights or recommendations you might have on how to achieve this. Thank you for your time and assistance. Best regards, Something like: @main struct Todo: App { var body: some Scene { DocumentGroup(editing: Item.self, contentType: .item) { ContentView() } WindowGroup { UndockView() .modelContainer(of documentGroup above) } } }
0
0
89
Apr ’25
Translate extension bahvior
DESCRIPTION OF PROBLEM We need to add an implementation that will have the same swipe/scroll behavior as the Apple Translator extension, here is the code that we are currently using: import SwiftUI import TranslationUIProvider @main class TranslationProviderExtension: TranslationUIProviderExtension { required init() {} var body: some TranslationUIProviderExtensionScene { TranslationUIProviderSelectedTextScene { context in VStack { TranslationProviderView(context: context) } } } } struct TranslationProviderView: View { @State var context: TranslationUIProviderContext init(context c: TranslationUIProviderContext) { context = c } var body: some View { ScrollableSheetView() } } struct ScrollableSheetView: View { var body: some View { ScrollView { VStack(spacing: 20) { ForEach(0..<50) { index in Text("Item (index)") .padding() .frame(maxWidth: .infinity) .background(Color.blue.opacity(0.1)) .cornerRadius(8) } } .padding() } .padding() } } Using this code, on the first extension run, swipe up will expand the extension (which is OK) but swiping down on the expanded state of the extension works only as a scroll instead of swiping the extension from expanded mode back to compact mode. STEPS TO REPRODUCE Select a text in Safari Tap on Translate in the contextual menu Swipe up on the text ->the extension expands into full mode Swipe down->only scrolls work, I cannot swipe the extension from full mode to compact mode. Expected behavior: when i swipe down on the expanded extension, the extension should get into compact mode, not continuously scroll down.
Topic: UI Frameworks SubTopic: SwiftUI
0
0
72
Apr ’25
ObservableObjects get retained after a TextField is focused
When presenting a SwiftUI sheet containing ObservableObject's injected using environmentObject(_) modifier, the objects are unexpectedly retained after the sheet is dismissed if a TextField within the sheet gains focus or is edited. This issue occurs on iOS and iPadOS (on macOS the objects are always released), observable both in the simulator and on physical devices, and happens even when the view does not explicitly reference these environment objects, and the TextField's content isn't bound to them. Expected Results: When the sheet is dismissed, all environment objects passed to the sheet’s content view should be released (deinitialized), regardless of whether the TextField was focused or edited. Actual Results: If the TextField was focused or edited, environment objects (ObservableA and ObservableB) are retained after the sheet is dismissed. They are not deinitialized as expected, leading to unintended retention. Interestingly, previously retained copies of these environment objects, if any, are released precisely at the moment the TextField becomes focused on subsequent presentations, indicating an inconsistent lifecycle behavior. I have filed an issue FB17226970 Sample Code Below is a sample code that consistently shows the issue on iOS 18.3+. Steps to Reproduce: Run the attached SwiftUI sample. Tap the button labeled “Show Sheet” to present a sheet. Tap on the TextField to focus or begin editing. Dismiss the sheet by dragging it down or by other dismissal methods (e.g., tapping outside on iPadOS). import SwiftUI struct ContentView: View { @State private var showSheet: Bool = false var body: some View { VStack { Button("Show Sheet") { showSheet = true } } .sheet(isPresented: $showSheet) { SheetContentView() .environmentObject(ObservableA()) .environmentObject(ObservableB()) } } } struct SheetContentView: View { @State private var text: String = "" var body: some View { TextField("Select to retain observable objects", text: $text) .textFieldStyle(.roundedBorder) } } final class ObservableA: ObservableObject { init() { print(type(of: self), #function) } deinit { print(type(of: self), #function) } } final class ObservableB: ObservableObject { init() { print(type(of: self), #function) } deinit { print(type(of: self), #function) } } #Preview { ContentView() }
2
0
200
Apr ’25
How to create a momentary segmented control in SwiftUI for macOS?
In AppKit, NSSegmentedControl has various styles defined by NSSegmentStyle and various tracking modes defined by NSSegmentSwitchTracking. How can we set these properties in SwiftUI? I'm currently using a Picker with the view modifier .pickerStyle(.segmented) applied but this seems to produce a segmented control with tracking set to "select one". In particular I'm looking for momentary tracking so that I can create navigation-style buttons for backward/forward navigation. Under AppKit, the canonical way to do this is an NSSegmentedControl of style separated and tracking momentary. Is that possible under SwiftUI for macOS? (Using the latest versions of everything.)
1
0
131
Apr ’25
VideoToolbox crash in macOS
My Mac app crashes for some users inside VideoToolbox, and I'm not sure what to do with that, and how to fix it. Here are couple of examples that repeating again and again for macOS 15.* Thread 10 Crashed: 0 libsystem_pthread.dylib 0x000000018535a8e0 0x185359000 + 6368 1 VideoToolbox 0x0000000194f3e218 0x194f28000 + 90648 2 VideoToolbox 0x00000001951de384 0x194f28000 + 2843524 3 libxpc.dylib 0x000000018506f2c0 0x185060000 + 62144 4 libxpc.dylib 0x000000018506da14 0x185060000 + 55828 5 libdispatch.dylib 0x00000001851ad674 0x1851a9000 + 18036 6 libdispatch.dylib 0x00000001851c9c88 0x1851a9000 + 134280 7 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 8 libdispatch.dylib 0x00000001851ca9dc 0x1851a9000 + 137692 9 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 10 libdispatch.dylib 0x00000001851b5764 0x1851a9000 + 51044 11 libdispatch.dylib 0x00000001851bf4cc 0x1851a9000 + 91340 12 libdispatch.dylib 0x00000001851bf260 0x1851a9000 + 90720 13 libsystem_pthread.dylib 0x00000001853602e4 0x185359000 + 29412 14 libsystem_pthread.dylib 0x000000018535b0fc 0x185359000 + 8444 and Thread 10 Crashed: 0 libsystem_pthread.dylib 0x00000001981fc364 0x1981fb000 + 4964 1 VideoToolbox 0x00000001a85f9964 0x1a81e8000 + 4266340 2 VideoToolbox 0x00000001a847a840 0x1a81e8000 + 2697280 3 libxpc.dylib 0x0000000197f09830 0x197efb000 + 59440 4 libxpc.dylib 0x0000000197f0812c 0x197efb000 + 53548 5 libdispatch.dylib 0x00000001980638a4 0x198048000 + 112804 6 libdispatch.dylib 0x00000001980660e8 0x198048000 + 123112 7 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 8 libdispatch.dylib 0x0000000198066e4c 0x198048000 + 126540 9 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 10 libdispatch.dylib 0x0000000198052e60 0x198048000 + 44640 11 libdispatch.dylib 0x000000019805be30 0x198048000 + 81456 12 libdispatch.dylib 0x000000019805bbf0 0x198048000 + 80880 13 libsystem_pthread.dylib 0x0000000198201c0c 0x1981fb000 + 27660 14 libsystem_pthread.dylib 0x00000001981fcb80 0x1981fb000 + 7040 and this one is for macOS 14 Thread 10 Crashed: 0 VideoToolbox 0x000000018f12ac90 0x18f11d000 + 56464 1 VideoToolbox 0x000000018f130a80 0x18f11d000 + 80512 2 VideoToolbox 0x000000018f131090 0x18f11d000 + 82064 3 VideoToolbox 0x000000018f130f94 0x18f11d000 + 81812 4 Remote for Mac 0x00000001048d521c 0x1048d0000 + 21020 5 Foundation 0x000000018174796c 0x181709000 + 256364 6 Foundation 0x000000018174782c 0x181709000 + 256044 7 Foundation 0x00000001817477bc 0x181709000 + 255932 8 Foundation 0x0000000181746b64 0x181709000 + 252772 9 Foundation 0x00000001817468d4 0x181709000 + 252116 10 Foundation 0x00000001817467c4 0x181709000 + 251844 11 libdispatch.dylib 0x00000001803b0470 0x18039d000 + 78960 12 libdispatch.dylib 0x00000001803a13e8 0x18039d000 + 17384 13 libdispatch.dylib 0x00000001803a48ec 0x18039d000 + 30956 14 libdispatch.dylib 0x00000001803a3f08 0x18039d000 + 28424 15 libdispatch.dylib 0x00000001803b2ea8 0x18039d000 + 89768 16 libdispatch.dylib 0x00000001803b36b8 0x18039d000 + 91832 17 libsystem_pthread.dylib 0x000000018054dfd0 0x18054b000 + 12240 18 libsystem_pthread.dylib 0x000000018054cd28 0x18054b000 + 7464
0
0
163
Apr ’25
App Crash with CarPlay & UIScene
My app crashed on iOS 18.1 only, here is the crash log: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'BUG IN CLIENT OF UIKIT: <CPTemplateApplicationScene: 0x1114bb780> -[UIScene _registerSettingsDiffActionArray:forKey:]: Registering the scene itself results in a retain cycle.' And I found this post: https://mastodon.social/@marcoarment/113280078320422999 Is this a system bug in iOS 18.1 beta 5?
1
0
116
Apr ’25
Does MKLookAroundViewController work on macOS?
Trying to incorporate a LookAroundView into my macOS application but unable to make the LookAroundView interactive at all. I can get it to display a static image, but there's no interactivity at all and no controls visible. This is using the SwiftUI LookAroundPreview view as well as trying to wrap MKLookAroundViewController inside an NSViewRepresentable. The navigation properties are set to true but that doesn't seem to make a difference. Would love to incorporate this feature but without interactivity its value is limited. macOS 15.4.1 (24E263), Xcode Version 16.3 (16E140)
1
0
117
Apr ’25
📍 Inconsistent POI Visibility Between Apple Maps and MKLocalSearch / CLGeocoder
Summary: Hi! I'm experiencing an issue between what Apple Maps displays in the UI and what is accessible via MapKit APIs such as MKLocalSearch and CLGeocoder. Specifically, some verified and publicly visible businesses (with proper POI categories like .cafe) are not returned by coordinate-based POI searches or reverse geocoding, even when their exact address and coordinates are known. Repro Steps: In Apple Maps (iOS), search for Rustic Knead located at: 1130 State St, Lemont, IL 60439 Note that: The business appears visually on the map It is categorized as a cafe The address is 1130 State St Now in code, attempt both: A coordinate-based POI search using MKLocalSearch.Request(region:) A reverse geocoding lookup via CLGeocoder.reverseGeocodeLocation Example coordinates: latitude: 41.673604, longitude: -88.002295 Expected Behavior: Given the precise coordinates and Apple Maps showing the POI publicly, I expect either or both of the following: MKLocalSearch should return the POI (Rustic Knead) within a reasonable radius and appropriate .pointOfInterestFilter. CLGeocoder should return a CLPlacemark with either name = "Rustic Knead" or an areasOfInterest value containing it. Actual Behavior: MKLocalSearch returns 0 POIs at that location, even with filters removed and radius increased to 500+ meters. CLGeocoder.reverseGeocodeLocation returns a valid postal address but does not include the business name in .name or areasOfInterest. Searching by business name (e.g., "Rustic Knead") does work, but coordinate/address-only lookups do not. Questions: Are there known limitations in how MapKit surfaces POIs by coordinate or reverse geocode? Is there a way to ensure public, categorized POIs are accessible programmatically via MapKit APIs? Is there a better strategy to provide coordinates and return a business name?
1
0
108
Apr ’25
How to make a UIButton resize its custom font text using `configurationUpdateHandler`?
I've read in this post that in order to make the configuration of UIButton adjust my custom font's size automatically I need to add implementation to recalculate the font's size inside configurationUpdateHandler. But how would this look like? I also read something about matching the font's text style. But at this point I'm just guessing. Here's the code: let loginButton = UIButton(configuration: config, primaryAction: nil) loginButton.configurationUpdateHandler = { button in guard var config = button.configuration else { return } let traits = button.traitCollection let baseTitleFont = UIFont.customFont(ofSize: 18, weight: .semibold) let baseSubtitleFont = UIFont.customFont(ofSize: 18, weight: .regular) let scaledTitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseTitleFont, compatibleWith: traits) let scaledSubtitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseSubtitleFont, compatibleWith: traits) config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in var outgoing = incoming outgoing.font = scaledTitleFont return outgoing } config.subtitleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in var outgoing = incoming outgoing.font = baseSubtitleFont return outgoing } button.configuration = config } Thanks in advance!
3
0
166
Apr ’25
VisionOS custom hover effect and click sound
I have created a custom hover effect per this WWDC video and many other examples on the Net: https://developer.apple.com/videos/play/wwdc2024/10152/ I can get the button to expand when looked at within a VisionOS device and it will invoke a tap event when tapped but there is no click sound like a normal SwiftUI button does in VisionOS! I can't for the life of me figure out why. Any help would be appreciated!
2
0
305
Apr ’25
How to match Status/Menu Bar font (Date and Time)
Hello, I am trying to match the font and the position of the date and time displayed. This is what it looks like: .font: NSFont.systemFont(ofSize: NSFont.systemFontSize, weight: .regular), .foregroundColor: NSColor.labelColor, .baselineOffset: 0.5 It looks great on built-in display, but on external 4K it is incorrect. The baselineOffest is unnecessary, and the font looks skinny in comparison. Can anyone comment on such issue?
5
0
242
Apr ’25
Using the UIPasteControl
Hello 👋🏽 I am a new iOS developer and I am having a hard time understanding the behavior of the new UIPasteControl to avoid showing the system prompt. Does anyone has any example code I could look at to understand the behavior. Idk how to set the target of the button to the general pasteboard. also I am using objective-c . thanks cristian
5
0
4.1k
Apr ’25
SwiftUI Button fade animation happens with a delay when in ScrollView
When we place a Button inside a ScrollView , the fade animation of the button is delayed, so most users won't see it I think. You can see this in the trivial example struct ContentView: View { var body: some View { ScrollView { Button { // empty } label: { Text("Fade animation test") } } } } Is there any way to opt out of this behavior? In UIKit, this was also the default behavior, but you could always change it by overriding touchesShouldCancel method. I think I can probably do that by rewriting an animation completely with some custom ButtonStyle or by rewriting a Button component completely, but it doesn't seem like a good solution to me, as I want the native look and feel (in case of button animation it is pretty easy to mimic though). And also for some components, like lists, Apple has already implemented the correct behavior by themselves somehow.
3
0
102
Apr ’25
SwiftUI ScrollView Jittery/Glitchy Scrolling in iOS 17
Evening All and hope you had a good weekend. I'm experiencing significant scrolling issues in my SwiftUI weather app running on iOS 17. When scrolling through the main content, the scrolling is glitchy and not smooth, particularly around transitions between different subviews in the scroll view. The Issue The scrolling behavior has these problems: Stuttering/jittery movement during normal scrolling The issue seems most noticeable around the transitions between the header sections and the content sections (WindDetailsView and WeatherDataView) Smooth deceleration is affected, with visible "jumps" during momentum scrolling The problem appears to be worse on devices with iOS 17 compared to previous iOS versions Current Implementation My app uses a standard SwiftUI ScrollView with offset tracking to create a parallax effect for the header when scrolling. I'm calculating offset values to animate the header and adjust its opacity as the user scrolls. Here's the core structure:
Topic: UI Frameworks SubTopic: SwiftUI
2
0
125
Apr ’25
Not Showing FileOpen with Document-
I have developed several document-based (NSDocument) applications for macOS is Cocoa. Now, I'm playing with a document app project in SwiftUI. If I launch the application out of box, a file-select panel will open just as you see in TextEdit. (Please see the picture below) How do we prevent it from appearing? I would rather show a blank window, which in fact appears if I just press Command + N. Thanks.
2
0
111
Apr ’25
Using handleExternalEvents scene modifier to route external events to the correct scene
In an iPadOS SwiftUI app supporting multiple scenes, each Scene responds to a particular way in which the app was launched. If app was launched by tapping an associated file or a deep link (custom URL), then, the URLHandlerScene is invoked. If app was launched by QuickAction (long tap on the app icon), then another Scene is invoked etc. Each Scene has a purpose and responds to a particular launch. But after defining handlesExternlEvents(matching:) scene modifier, the scene was not getting launched when user taps the associated file or the app's Deeplinks was invoked. @main struct IOSSwiftUIScenesApp: App { var body: some Scene { DefaultScene() URLHandlerScene() .handlesExternalEvents(matching: ["file://"]) // Launched by an associated file .handlesExternalEvents(matching: ["Companion://"]) // Launched by Deeplink. // Other scenes } } struct URLHandlerScene: Scene { @State private var inputURL: URL // Store the incoming URL init() { self.inputURL = URL(string: "Temp://")! } var body: some Scene { WindowGroup { URLhandlerView(inputURL: $inputURL) .onOpenURL(perform: { (fileURL: URL) in log(String(format: "URLhandlerView().onOpenURL | Thread.current = %@", String(describing: Thread.current))) log("fileURL = " + String(describing: fileURL)) inputURL = fileURL }) } } } As shown above, I've attached handlesExternalEvents(matching:) modifier with "file://" for the associate file and "Companion" is my custom URL scheme. As per the scene matching rules documented here, my URLHandlerScene should get launched, but every time I launch the app using associated file or 'open' a Deeplink, the DefaultScene is always launched. What is missing here? Can someone please help?
1
0
148
Apr ’25
How do I use "views" and structures / what's wrong with my code?
what's wrong with my code? im getting error "Closure containing control flow statement cannot be used with result builder 'ViewBuilder' " next to my for loop... // // ContentView.swift // Bouncing Balls Simulation without ChatGPT's Code // // Created by Hillary Basile on 3/30/25. // import SwiftUI import Foundation import CoreGraphics class Balls { //var color: String var xPosition: Int var yPosition: Int var xVelocity: Int var yVelocity: Int var radius: Int var gravity: CGFloat var restitution: Int var other: Balls? init(xPosition: Int, yPosition: Int, xVelocity: Int, yVelocity: Int, radius: Int, gravity: CGFloat, restitution: Int) //ADD COLOR { //self.color = color self.xPosition = xPosition self.yPosition = yPosition self.xVelocity = xVelocity self.yVelocity = yVelocity self.radius = radius self.gravity = gravity self.restitution = restitution } let ball1: Balls = Balls (xPosition: 100, yPosition: 100, xVelocity: 3, yVelocity: 0, radius: 3, gravity: 0.3, restitution: 1) let ball2: Balls = Balls (xPosition: 200, yPosition: 50, xVelocity: -2, yVelocity: 2, radius: 3, gravity: 0.3, restitution: 1) let ball3: Balls = Balls (xPosition: 300, yPosition: 150, xVelocity: 4, yVelocity: -3, radius: 3, gravity: 0.3, restitution: 1) struct UserView: View { var timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect() var body: some View { VStack { //Background color Color.gray.edgesIgnoringSafeArea(.all) //var balls [Int] = [ball1; ball2; ball3] for item in Balls { Circle() .fill(Color.black) .frame(width: 50, height: 50) .position(Balls[].xPosition, Balls[].yPosition) .onReceive(timer) { self.yVelocity += self.gravity self.xPosition = CGPoint(self.xPosition + self.xVelocity) self .yPosition = CGPoint (self.yPosition + self.yVelocity) if self.yPosition >= 500 - 25 { self.yPosition = 500 - 25 self.yVelocity = -self.yVelocity * self.restitution } if self.xPosition <= 25 { self.xPosition = 25 self.xVelocity = -self.xVelocity } if self.xPosition >= 375 { self.xPosition = 375 self .xVelocity = -self.velocityX } let dx: int = other.xPosition - self.xPosition let dy: int = other.yPosition - self.yPosition let distance: int = sqrt (dx * dx + dy * dy) if distance < self.radius + other.radius { self.xVelocity = -self.xVelocity * self.restitution self.yVelocity = -self.yVelocity * self.restitution other.xVelocity = -other.xVelocity * self.restitution other.yVelocity = -other.yVelocity * self.restitution } } } } } } } } #Preview { ContentView() } }
Topic: UI Frameworks SubTopic: SwiftUI
Replies
5
Boosts
0
Views
159
Activity
Apr ’25
Reading large documents
Can the SwiftUI document architecture Take a file as read-only; never to be written out Take files too large for memory (multi-MB, or even GB) I wouldn't want the system to read a gigabyte size file into memory by default. If the system can use a memory-mapped Data as the representation, that'll be something I can make do. It would be even better if I could tell the system that I'll handle all the reading, all I need from it is a reference to the file's location on disk.
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
53
Activity
Apr ’25
UIScrollView in UIViewControllerRepresentable - UI freezes when content touches bottom SafeArea
The SwiftUI ScrollView lacks some features I need and so I created a custom MyScrollView based on UIScrollView wrapped within a UIViewControllerRepresentable. While this works fine in general I know came across a very strange problem: When MyScrollView is used in a sheet and its content touches bottom SafeArea, the UI freezes as soon as the should be displayed. The code below shows the problem as well in preview as on the simulator and on devices. Please note that the code is tuned do the display size of an iPhone 16 Pro. When running on different devices one might need to adjust height of the Color.yellow. In the demo code the UI freezes if the Color.yellow has a height between 738 to 771 pixels. Every other height is fine. Is there something wrong with my implementation of MyScrollView? When using ScrollView instead, everything works fine. Code: struct ContentView: View { @State private var showSheet: Bool = false var body: some View { ZStack { Button("Show Sheet") { showSheet = true } } .sheet(isPresented: $showSheet) { VStack { Text("Some Header Content") MyScrollView { VStack { Color.yellow //.frame(height: 737) // works .frame(height: 738) // does NOT works // ... //.frame(height: 771) // does NOT works //.frame(height: 772) // works } } .ignoresSafeArea() } } } } struct MyScrollView<Content: View>: UIViewControllerRepresentable { let content: Content init(@ViewBuilder content: () -> Content) { self.content = content() } func makeUIViewController(context: Context) -> UIViewController { let scrollViewVC = UIViewController() scrollViewVC.view.backgroundColor = .clear let scrollView = UIScrollView() scrollView.backgroundColor = .clear let contentVC = UIHostingController(rootView: self.content) contentVC.view.backgroundColor = .clear context.coordinator.contentVC = contentVC context.coordinator.scrollView = scrollView scrollView.translatesAutoresizingMaskIntoConstraints = false scrollViewVC.view.addSubview(scrollView) NSLayoutConstraint.activate([ scrollView.topAnchor.constraint(equalTo: scrollViewVC.view.topAnchor), scrollView.bottomAnchor.constraint(equalTo: scrollViewVC.view.bottomAnchor), scrollView.leadingAnchor.constraint(equalTo: scrollViewVC.view.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: scrollViewVC.view.trailingAnchor) ]) contentVC.willMove(toParent: scrollViewVC) scrollViewVC.addChild(contentVC) contentVC.view.translatesAutoresizingMaskIntoConstraints = false scrollView.addSubview(contentVC.view) NSLayoutConstraint.activate([ contentVC.view.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor), contentVC.view.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor), contentVC.view.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), contentVC.view.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), contentVC.view.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor) ]) contentVC.didMove(toParent: scrollViewVC) return scrollViewVC } func updateUIViewController(_ uiViewController: UIViewController, context: Context) { context.coordinator.contentVC?.rootView = content } func makeCoordinator() -> Coordinator { return Coordinator() } class Coordinator { var contentVC: UIHostingController<Content>? var scrollView: UIScrollView? init() { //... } } } #Preview { ContentView() }
Topic: UI Frameworks SubTopic: SwiftUI
Replies
2
Boosts
0
Views
115
Activity
Apr ’25
Access DocumentGroup container by external WindowGroup
Hi, I am currently developing a document-based application for macOS and have encountered a challenge related to document container management. Specifically, I need to open a windowGroup that shares the same container as the one used in the DocumentGroup. However, my current approach of using a global shared model container has led to unintended behavior: any new document created is linked to existing ones, and changes made in one document are reflected across all documents. To address this issue, I am looking for a solution that allows each newly created document to be individualized while still sharing the document container with all relevant WindowGroups that require access to the data it holds. I would greatly appreciate any insights or recommendations you might have on how to achieve this. Thank you for your time and assistance. Best regards, Something like: @main struct Todo: App { var body: some Scene { DocumentGroup(editing: Item.self, contentType: .item) { ContentView() } WindowGroup { UndockView() .modelContainer(of documentGroup above) } } }
Replies
0
Boosts
0
Views
89
Activity
Apr ’25
Translate extension bahvior
DESCRIPTION OF PROBLEM We need to add an implementation that will have the same swipe/scroll behavior as the Apple Translator extension, here is the code that we are currently using: import SwiftUI import TranslationUIProvider @main class TranslationProviderExtension: TranslationUIProviderExtension { required init() {} var body: some TranslationUIProviderExtensionScene { TranslationUIProviderSelectedTextScene { context in VStack { TranslationProviderView(context: context) } } } } struct TranslationProviderView: View { @State var context: TranslationUIProviderContext init(context c: TranslationUIProviderContext) { context = c } var body: some View { ScrollableSheetView() } } struct ScrollableSheetView: View { var body: some View { ScrollView { VStack(spacing: 20) { ForEach(0..<50) { index in Text("Item (index)") .padding() .frame(maxWidth: .infinity) .background(Color.blue.opacity(0.1)) .cornerRadius(8) } } .padding() } .padding() } } Using this code, on the first extension run, swipe up will expand the extension (which is OK) but swiping down on the expanded state of the extension works only as a scroll instead of swiping the extension from expanded mode back to compact mode. STEPS TO REPRODUCE Select a text in Safari Tap on Translate in the contextual menu Swipe up on the text ->the extension expands into full mode Swipe down->only scrolls work, I cannot swipe the extension from full mode to compact mode. Expected behavior: when i swipe down on the expanded extension, the extension should get into compact mode, not continuously scroll down.
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
72
Activity
Apr ’25
ObservableObjects get retained after a TextField is focused
When presenting a SwiftUI sheet containing ObservableObject's injected using environmentObject(_) modifier, the objects are unexpectedly retained after the sheet is dismissed if a TextField within the sheet gains focus or is edited. This issue occurs on iOS and iPadOS (on macOS the objects are always released), observable both in the simulator and on physical devices, and happens even when the view does not explicitly reference these environment objects, and the TextField's content isn't bound to them. Expected Results: When the sheet is dismissed, all environment objects passed to the sheet’s content view should be released (deinitialized), regardless of whether the TextField was focused or edited. Actual Results: If the TextField was focused or edited, environment objects (ObservableA and ObservableB) are retained after the sheet is dismissed. They are not deinitialized as expected, leading to unintended retention. Interestingly, previously retained copies of these environment objects, if any, are released precisely at the moment the TextField becomes focused on subsequent presentations, indicating an inconsistent lifecycle behavior. I have filed an issue FB17226970 Sample Code Below is a sample code that consistently shows the issue on iOS 18.3+. Steps to Reproduce: Run the attached SwiftUI sample. Tap the button labeled “Show Sheet” to present a sheet. Tap on the TextField to focus or begin editing. Dismiss the sheet by dragging it down or by other dismissal methods (e.g., tapping outside on iPadOS). import SwiftUI struct ContentView: View { @State private var showSheet: Bool = false var body: some View { VStack { Button("Show Sheet") { showSheet = true } } .sheet(isPresented: $showSheet) { SheetContentView() .environmentObject(ObservableA()) .environmentObject(ObservableB()) } } } struct SheetContentView: View { @State private var text: String = "" var body: some View { TextField("Select to retain observable objects", text: $text) .textFieldStyle(.roundedBorder) } } final class ObservableA: ObservableObject { init() { print(type(of: self), #function) } deinit { print(type(of: self), #function) } } final class ObservableB: ObservableObject { init() { print(type(of: self), #function) } deinit { print(type(of: self), #function) } } #Preview { ContentView() }
Replies
2
Boosts
0
Views
200
Activity
Apr ’25
How to create a momentary segmented control in SwiftUI for macOS?
In AppKit, NSSegmentedControl has various styles defined by NSSegmentStyle and various tracking modes defined by NSSegmentSwitchTracking. How can we set these properties in SwiftUI? I'm currently using a Picker with the view modifier .pickerStyle(.segmented) applied but this seems to produce a segmented control with tracking set to "select one". In particular I'm looking for momentary tracking so that I can create navigation-style buttons for backward/forward navigation. Under AppKit, the canonical way to do this is an NSSegmentedControl of style separated and tracking momentary. Is that possible under SwiftUI for macOS? (Using the latest versions of everything.)
Replies
1
Boosts
0
Views
131
Activity
Apr ’25
VideoToolbox crash in macOS
My Mac app crashes for some users inside VideoToolbox, and I'm not sure what to do with that, and how to fix it. Here are couple of examples that repeating again and again for macOS 15.* Thread 10 Crashed: 0 libsystem_pthread.dylib 0x000000018535a8e0 0x185359000 + 6368 1 VideoToolbox 0x0000000194f3e218 0x194f28000 + 90648 2 VideoToolbox 0x00000001951de384 0x194f28000 + 2843524 3 libxpc.dylib 0x000000018506f2c0 0x185060000 + 62144 4 libxpc.dylib 0x000000018506da14 0x185060000 + 55828 5 libdispatch.dylib 0x00000001851ad674 0x1851a9000 + 18036 6 libdispatch.dylib 0x00000001851c9c88 0x1851a9000 + 134280 7 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 8 libdispatch.dylib 0x00000001851ca9dc 0x1851a9000 + 137692 9 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 10 libdispatch.dylib 0x00000001851b5764 0x1851a9000 + 51044 11 libdispatch.dylib 0x00000001851bf4cc 0x1851a9000 + 91340 12 libdispatch.dylib 0x00000001851bf260 0x1851a9000 + 90720 13 libsystem_pthread.dylib 0x00000001853602e4 0x185359000 + 29412 14 libsystem_pthread.dylib 0x000000018535b0fc 0x185359000 + 8444 and Thread 10 Crashed: 0 libsystem_pthread.dylib 0x00000001981fc364 0x1981fb000 + 4964 1 VideoToolbox 0x00000001a85f9964 0x1a81e8000 + 4266340 2 VideoToolbox 0x00000001a847a840 0x1a81e8000 + 2697280 3 libxpc.dylib 0x0000000197f09830 0x197efb000 + 59440 4 libxpc.dylib 0x0000000197f0812c 0x197efb000 + 53548 5 libdispatch.dylib 0x00000001980638a4 0x198048000 + 112804 6 libdispatch.dylib 0x00000001980660e8 0x198048000 + 123112 7 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 8 libdispatch.dylib 0x0000000198066e4c 0x198048000 + 126540 9 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 10 libdispatch.dylib 0x0000000198052e60 0x198048000 + 44640 11 libdispatch.dylib 0x000000019805be30 0x198048000 + 81456 12 libdispatch.dylib 0x000000019805bbf0 0x198048000 + 80880 13 libsystem_pthread.dylib 0x0000000198201c0c 0x1981fb000 + 27660 14 libsystem_pthread.dylib 0x00000001981fcb80 0x1981fb000 + 7040 and this one is for macOS 14 Thread 10 Crashed: 0 VideoToolbox 0x000000018f12ac90 0x18f11d000 + 56464 1 VideoToolbox 0x000000018f130a80 0x18f11d000 + 80512 2 VideoToolbox 0x000000018f131090 0x18f11d000 + 82064 3 VideoToolbox 0x000000018f130f94 0x18f11d000 + 81812 4 Remote for Mac 0x00000001048d521c 0x1048d0000 + 21020 5 Foundation 0x000000018174796c 0x181709000 + 256364 6 Foundation 0x000000018174782c 0x181709000 + 256044 7 Foundation 0x00000001817477bc 0x181709000 + 255932 8 Foundation 0x0000000181746b64 0x181709000 + 252772 9 Foundation 0x00000001817468d4 0x181709000 + 252116 10 Foundation 0x00000001817467c4 0x181709000 + 251844 11 libdispatch.dylib 0x00000001803b0470 0x18039d000 + 78960 12 libdispatch.dylib 0x00000001803a13e8 0x18039d000 + 17384 13 libdispatch.dylib 0x00000001803a48ec 0x18039d000 + 30956 14 libdispatch.dylib 0x00000001803a3f08 0x18039d000 + 28424 15 libdispatch.dylib 0x00000001803b2ea8 0x18039d000 + 89768 16 libdispatch.dylib 0x00000001803b36b8 0x18039d000 + 91832 17 libsystem_pthread.dylib 0x000000018054dfd0 0x18054b000 + 12240 18 libsystem_pthread.dylib 0x000000018054cd28 0x18054b000 + 7464
Replies
0
Boosts
0
Views
163
Activity
Apr ’25
App Crash with CarPlay & UIScene
My app crashed on iOS 18.1 only, here is the crash log: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'BUG IN CLIENT OF UIKIT: <CPTemplateApplicationScene: 0x1114bb780> -[UIScene _registerSettingsDiffActionArray:forKey:]: Registering the scene itself results in a retain cycle.' And I found this post: https://mastodon.social/@marcoarment/113280078320422999 Is this a system bug in iOS 18.1 beta 5?
Replies
1
Boosts
0
Views
116
Activity
Apr ’25
Does MKLookAroundViewController work on macOS?
Trying to incorporate a LookAroundView into my macOS application but unable to make the LookAroundView interactive at all. I can get it to display a static image, but there's no interactivity at all and no controls visible. This is using the SwiftUI LookAroundPreview view as well as trying to wrap MKLookAroundViewController inside an NSViewRepresentable. The navigation properties are set to true but that doesn't seem to make a difference. Would love to incorporate this feature but without interactivity its value is limited. macOS 15.4.1 (24E263), Xcode Version 16.3 (16E140)
Replies
1
Boosts
0
Views
117
Activity
Apr ’25
📍 Inconsistent POI Visibility Between Apple Maps and MKLocalSearch / CLGeocoder
Summary: Hi! I'm experiencing an issue between what Apple Maps displays in the UI and what is accessible via MapKit APIs such as MKLocalSearch and CLGeocoder. Specifically, some verified and publicly visible businesses (with proper POI categories like .cafe) are not returned by coordinate-based POI searches or reverse geocoding, even when their exact address and coordinates are known. Repro Steps: In Apple Maps (iOS), search for Rustic Knead located at: 1130 State St, Lemont, IL 60439 Note that: The business appears visually on the map It is categorized as a cafe The address is 1130 State St Now in code, attempt both: A coordinate-based POI search using MKLocalSearch.Request(region:) A reverse geocoding lookup via CLGeocoder.reverseGeocodeLocation Example coordinates: latitude: 41.673604, longitude: -88.002295 Expected Behavior: Given the precise coordinates and Apple Maps showing the POI publicly, I expect either or both of the following: MKLocalSearch should return the POI (Rustic Knead) within a reasonable radius and appropriate .pointOfInterestFilter. CLGeocoder should return a CLPlacemark with either name = "Rustic Knead" or an areasOfInterest value containing it. Actual Behavior: MKLocalSearch returns 0 POIs at that location, even with filters removed and radius increased to 500+ meters. CLGeocoder.reverseGeocodeLocation returns a valid postal address but does not include the business name in .name or areasOfInterest. Searching by business name (e.g., "Rustic Knead") does work, but coordinate/address-only lookups do not. Questions: Are there known limitations in how MapKit surfaces POIs by coordinate or reverse geocode? Is there a way to ensure public, categorized POIs are accessible programmatically via MapKit APIs? Is there a better strategy to provide coordinates and return a business name?
Replies
1
Boosts
0
Views
108
Activity
Apr ’25
Is there a way to present a fullscreen view controller and keep drawing the presenting view controller?
Looking for a solution that keeps the presented view controller fullscreen. The background is that I need to take some screenshots of the presenting view controller while the modal is onscreen. It's a pretty messy operation and we don't want to distract and delay the user by doing it before the modal is presented.
Topic: UI Frameworks SubTopic: UIKit
Replies
1
Boosts
0
Views
44
Activity
Apr ’25
How to make a UIButton resize its custom font text using `configurationUpdateHandler`?
I've read in this post that in order to make the configuration of UIButton adjust my custom font's size automatically I need to add implementation to recalculate the font's size inside configurationUpdateHandler. But how would this look like? I also read something about matching the font's text style. But at this point I'm just guessing. Here's the code: let loginButton = UIButton(configuration: config, primaryAction: nil) loginButton.configurationUpdateHandler = { button in guard var config = button.configuration else { return } let traits = button.traitCollection let baseTitleFont = UIFont.customFont(ofSize: 18, weight: .semibold) let baseSubtitleFont = UIFont.customFont(ofSize: 18, weight: .regular) let scaledTitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseTitleFont, compatibleWith: traits) let scaledSubtitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseSubtitleFont, compatibleWith: traits) config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in var outgoing = incoming outgoing.font = scaledTitleFont return outgoing } config.subtitleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in var outgoing = incoming outgoing.font = baseSubtitleFont return outgoing } button.configuration = config } Thanks in advance!
Replies
3
Boosts
0
Views
166
Activity
Apr ’25
VisionOS custom hover effect and click sound
I have created a custom hover effect per this WWDC video and many other examples on the Net: https://developer.apple.com/videos/play/wwdc2024/10152/ I can get the button to expand when looked at within a VisionOS device and it will invoke a tap event when tapped but there is no click sound like a normal SwiftUI button does in VisionOS! I can't for the life of me figure out why. Any help would be appreciated!
Replies
2
Boosts
0
Views
305
Activity
Apr ’25
How to match Status/Menu Bar font (Date and Time)
Hello, I am trying to match the font and the position of the date and time displayed. This is what it looks like: .font: NSFont.systemFont(ofSize: NSFont.systemFontSize, weight: .regular), .foregroundColor: NSColor.labelColor, .baselineOffset: 0.5 It looks great on built-in display, but on external 4K it is incorrect. The baselineOffest is unnecessary, and the font looks skinny in comparison. Can anyone comment on such issue?
Replies
5
Boosts
0
Views
242
Activity
Apr ’25
Using the UIPasteControl
Hello 👋🏽 I am a new iOS developer and I am having a hard time understanding the behavior of the new UIPasteControl to avoid showing the system prompt. Does anyone has any example code I could look at to understand the behavior. Idk how to set the target of the button to the general pasteboard. also I am using objective-c . thanks cristian
Replies
5
Boosts
0
Views
4.1k
Activity
Apr ’25
SwiftUI Button fade animation happens with a delay when in ScrollView
When we place a Button inside a ScrollView , the fade animation of the button is delayed, so most users won't see it I think. You can see this in the trivial example struct ContentView: View { var body: some View { ScrollView { Button { // empty } label: { Text("Fade animation test") } } } } Is there any way to opt out of this behavior? In UIKit, this was also the default behavior, but you could always change it by overriding touchesShouldCancel method. I think I can probably do that by rewriting an animation completely with some custom ButtonStyle or by rewriting a Button component completely, but it doesn't seem like a good solution to me, as I want the native look and feel (in case of button animation it is pretty easy to mimic though). And also for some components, like lists, Apple has already implemented the correct behavior by themselves somehow.
Replies
3
Boosts
0
Views
102
Activity
Apr ’25
SwiftUI ScrollView Jittery/Glitchy Scrolling in iOS 17
Evening All and hope you had a good weekend. I'm experiencing significant scrolling issues in my SwiftUI weather app running on iOS 17. When scrolling through the main content, the scrolling is glitchy and not smooth, particularly around transitions between different subviews in the scroll view. The Issue The scrolling behavior has these problems: Stuttering/jittery movement during normal scrolling The issue seems most noticeable around the transitions between the header sections and the content sections (WindDetailsView and WeatherDataView) Smooth deceleration is affected, with visible "jumps" during momentum scrolling The problem appears to be worse on devices with iOS 17 compared to previous iOS versions Current Implementation My app uses a standard SwiftUI ScrollView with offset tracking to create a parallax effect for the header when scrolling. I'm calculating offset values to animate the header and adjust its opacity as the user scrolls. Here's the core structure:
Topic: UI Frameworks SubTopic: SwiftUI
Replies
2
Boosts
0
Views
125
Activity
Apr ’25
Not Showing FileOpen with Document-
I have developed several document-based (NSDocument) applications for macOS is Cocoa. Now, I'm playing with a document app project in SwiftUI. If I launch the application out of box, a file-select panel will open just as you see in TextEdit. (Please see the picture below) How do we prevent it from appearing? I would rather show a blank window, which in fact appears if I just press Command + N. Thanks.
Replies
2
Boosts
0
Views
111
Activity
Apr ’25
Using handleExternalEvents scene modifier to route external events to the correct scene
In an iPadOS SwiftUI app supporting multiple scenes, each Scene responds to a particular way in which the app was launched. If app was launched by tapping an associated file or a deep link (custom URL), then, the URLHandlerScene is invoked. If app was launched by QuickAction (long tap on the app icon), then another Scene is invoked etc. Each Scene has a purpose and responds to a particular launch. But after defining handlesExternlEvents(matching:) scene modifier, the scene was not getting launched when user taps the associated file or the app's Deeplinks was invoked. @main struct IOSSwiftUIScenesApp: App { var body: some Scene { DefaultScene() URLHandlerScene() .handlesExternalEvents(matching: ["file://"]) // Launched by an associated file .handlesExternalEvents(matching: ["Companion://"]) // Launched by Deeplink. // Other scenes } } struct URLHandlerScene: Scene { @State private var inputURL: URL // Store the incoming URL init() { self.inputURL = URL(string: "Temp://")! } var body: some Scene { WindowGroup { URLhandlerView(inputURL: $inputURL) .onOpenURL(perform: { (fileURL: URL) in log(String(format: "URLhandlerView().onOpenURL | Thread.current = %@", String(describing: Thread.current))) log("fileURL = " + String(describing: fileURL)) inputURL = fileURL }) } } } As shown above, I've attached handlesExternalEvents(matching:) modifier with "file://" for the associate file and "Companion" is my custom URL scheme. As per the scene matching rules documented here, my URLHandlerScene should get launched, but every time I launch the app using associated file or 'open' a Deeplink, the DefaultScene is always launched. What is missing here? Can someone please help?
Replies
1
Boosts
0
Views
148
Activity
Apr ’25