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

Post

Replies

Boosts

Views

Activity

SwiftData: Default value for added property
Let's say I have a model like this: @Model final class DataModel { var firstProperty: String = "" } Later on I create a new property as such: @Model final class DataModel { enum DataEnum { case dataCase } var firstProperty: String = "" var secondProperty: DataEnum? = .dataCase } My expectation is for the data that is already stored, the secondProperty would be added with a default value of .dataCase. However, it's being set to nil instead. I could have sworn it would set to the default value given to it. Has that changed, or has it always been this way? Does this require a migration plan?
0
0
90
2d
Prevent macOS window.level floating from showing on all screens in a multi monitor setup?
I am using the window.level set to .floating as described here: https://developer.apple.com/documentation/appkit/nswindow/level The setting itself works okay. However, in a multi monitor setup, the floating window is appearing on both the screens. How can I prevent this? My users report that before macOS Sonoma, this used to not happen. Has this behaviour changed? How can I revert back to the old behaviour?
1
0
81
2d
SwiftUI DatePicker size not configurable
Hey guys, I'm totally new to Swift programming and I'm setting up a view for registering users. I use a VStack to organize the TextFields as well as a DatePicker, but the last one seems to be very rebellious. Here's my code: VStack { TextField("E-Mailadresse", text: $mail) .frame(height: 30) .textFieldStyle(.roundedBorder) .multilineTextAlignment(.center) .focused($hasFocus, equals: .mail) .onKeyPress(.tab, action: {hasFocus = .password; return .handled}) SecureField("Passwort", text: $password) .frame(height: 30) .textFieldStyle(.roundedBorder) .multilineTextAlignment(.center) .focused($hasFocus, equals: .password) .onKeyPress(.tab, action: {hasFocus = .name; return .handled}) TextField("Name", text: $name) .frame(height: 30) .textFieldStyle(.roundedBorder) .multilineTextAlignment(.center) .focused($hasFocus, equals: .name) .onKeyPress(.tab, action: {hasFocus = .prename; return .handled}) TextField("Vorname", text: $prename) .frame(height: 30) .textFieldStyle(.roundedBorder) .multilineTextAlignment(.center) .focused($hasFocus, equals: .prename) .onKeyPress(.tab, action: {hasFocus = .birthday; return .handled}) DatePicker("Geb.:", selection: $birthday, displayedComponents: [.date]) .datePickerStyle(.wheel) .clipped() //.focused($hasFocus, equals: .birthday) Button("Registrieren") {self.register()} .padding(.top, 20) .keyboardShortcut(.defaultAction) } .frame(width: 375) } And this is how it looks like: As you can see, neither is the DatePicker centered correctly (it's more left located) nor is it clipped (reduced). I also tried adding a .frame() to itself, then I was ably to reduce it to the preferred height, but I can' reduce its width and as a result of this, I can also not write a full label like "Date of Birth" or something, because the wheel of the DatePicker always overlays it... Is that a kind of misbehavior or am I missing something? Thank you very much in anticipation for your feedback! Kind regards Kevin
1
0
92
2d
Management of multiple root views in SwiftUI
Hey guys, I'm totally unexperienced in Swift coding and I'm doing my first steps using Swift Playgrounds on my macOS as well as on my iPadOS. I'm setting up a simple App that can be divided in 4 main categories (Splash, Authentication, Content, Setup). Each category (except the Splash as the short intro when running the app) can have a NavigationStack (e. g. switching between login view, register view, forgott password view in authentication). So I thought about having a root view for each of them. My google research gave me lots of ways and hints but it's not clear at all for me if I should and how I should do this. I often read about a RootViewController but I guess that's UIKit stuff and nothing for SwiftUI. Then I read about delegates and such. Then, I read an article that exactly fits my goals and I just liked to get your opinion what you think about this way to solve my plan: First of all, I define a separate class for a appRootManager: final class appRootManager: ObservableObject { enum eRootViews { case Splash, Authentification, Content, Setup } @Published var currentRoot: eRootViews = .Splash } The main app file looks like this: @main struct MyApp: App { @StateObject private var oRootManager = appRootManager() var body: some Scene { WindowGroup() { Group { switch oRootManager.currentRoot { case .Splash: viewSplash() case .Authentification: viewLogin() case .Content: viewContent() case .Setup: viewSetup() } } .environmentObject(oRootManager) .modelContainer(for: [Account.self]) } } } In each of the for root view files (e. g. Splash view) I make the appRootManager addressable and switch the root view by updating the enum value, like for example: struct viewSplash: View { @EnvironmentObject private var oRootManager: appRootManager var body: some View { ZStack { Color.blue .ignoresSafeArea() Text("Hello World") .font(.title) .fontWeight(.semibold) .foregroundColor(.white) } .onAppear() { DispatchQueue.main.asyncAfter(deadline: .now() + 3) { withAnimation(.spring()) {oRootManager.currentRoot = .Authentification} } } } } It works fine and does exactly what I like to have (when I run the app out of Swift Playgrounds). I'm just wondering why it does not work in the App Preview in Swift Playgrounds and this is why I'd like to have your opinion to the way I solve my plan. I'm very happy for any feedback. Thanks a lot in anticipation! Kind regards Kevin
1
0
91
2d
Bring iOS app to foreground from Apple Watch app
Exploring Live Activity feature for Apple Watch right now and found that it has this default view with "Open on iPhone" button when you tap Live Activity. That button perfectly brings iOS app to foreground as if you tapped iOS's Live Activity. Is there a way to mimic that behavior from inside Watch app code? From inside WKApplicationDelegate, for example Tried openSystemURL but it seems lile it's only available for tel or sms links
1
0
86
2d
Limiting UITableView Width Across Different Table View Configurations
I have an iOS App which looks great on iPhone, portrait only, which makes a lot of use of UITableViews. On iPad those tables look stretched out in Landscape. On MacOS with Apple Silicon the app can be resized to any size and the table views look very stretched. There are views in the App which users want to resize so limiting app size not an option. I've been modifying the app's table views to limit their width and centre them using constraints. This isn't easy, it's a lot of work as UITableViewController doesn't allow for constraining the table width. Or does it? So I've changed them to UIViewControllers with UITableView imbedded in the root UIView with constraints. Looks really nice. Now I've just run into the limitation that static tables, which I have a number of, aren't allowed to be embedded. So how can I limit the width of them? I really don't want to add a lot of dynamic code. Please tell me there's an simpler, more elegant method to what really makes a much more aesthetically pleasing UI on iOS App running on iPad and MacOS? TIA!
2
0
82
3d
Problem with audio files in Swift
Hi guys, I've been this app for quite a while and I wanted to add audio to it but I've encountered a strange bug. Whenever I try to play the audio from the testing device, it prints out that the audio file cannot be found. I've checked multiple times the names and the code and I get no errors there whatsoever. I have no idea what might be causing this. Here's a part of the code: `import SwiftUI import AVFoundation struct Card: Identifiable { let id = UUID() let heading: String let description: String let imageName: String let detailDescription: String let sonification: String } struct ExplorepageUI: View { @State private var selectedCard: Card? @State private var showMore = false @State private var currentIndex = 0 @State private var currentCards: [Card] = [] let galaxies = [ Card(heading: "The Mice Galaxies", description: "They’re located about 300 million light-years away in the constellation Coma Berenices.", imageName: "TheMiceGalaxiesHubble", detailDescription:""" Their name refers to the long tails produced by tidal action, the relative difference between gravitational pulls on the near and far parts of each galaxy, known here as a galactic tide. It is a possibility that both galaxies, which are members of the Coma Cluster, have experienced collision, and will continue colliding until they coalesce. The colors of the galaxies are peculiar. In NGC 4676A a core with some dark markings is surrounded by a bluish white remnant of spiral arms. The tail is unusual, starting out blue and terminating in a more yellowish color, despite the fact that the beginning of each arm in virtually every spiral galaxy starts yellow and terminates in a bluish color. NGC 4676B has a yellowish core and two arcs; arm remnants underneath are bluish as well. The galaxies were photographed in 2002 by the Hubble Space Telescope. In the background of the Mice Galaxies, there are over 3000 galaxies, at distances up to 13 billion light-years. """, sonification: "SonificationoftheMiceGalaxies"), `class MusicPlayer: ObservableObject { private var audioPlayer: AVPlayer? func playSound(named sonificationFileName: String){ if let url = Bundle.main.url(forResource: sonificationFileName, withExtension: "mp3"){ print("✅ Found audio file at: \(url)") audioPlayer = try? AVPlayer(url: url) audioPlayer?.play() print("🎵 Audio should now be playing!") } else { print("❌ Audio file not found: \(sonificationFileName).mp3") } } func pause(){ audioPlayer?.pause() } }
1
0
100
3d
onMove bug
I'm not sure where to report this, so here it is. If you have a list of items and you make them clickable and movable, moving one or more items in the list and then clicking will cause them to move. This is yet another reason that SwiftData needs to track onMove. Minimal reproducible code: // // ContentView.swift // exampleBug // // Create a new project. // Replace the default Item class with the one below, and replace ContentView with its class below // Run the app and add a few items a few seconds apart so you can tell them apart. // Drag an item to a new position in the list. // Click one of the checkboxes and watch the list positions change for no reason! // import SwiftUI import SwiftData @Model final class Item { var timestamp: Date var checkbox: Bool = false init(timestamp: Date) { self.timestamp = timestamp } } struct ContentView: View { @Environment(\.modelContext) private var modelContext @State private var editMode = EditMode.inactive @Query private var items: [Item] var body: some View { NavigationStack { List { ForEach(items) { item in HStack { Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) Button("", systemImage: item.checkbox ? "checkmark.circle.fill" : "circle") { item.checkbox.toggle() try? modelContext.save() } } } .onMove(perform: { indices, newOffset in var theItems = items theItems.move(fromOffsets: indices, toOffset: newOffset) }) } .environment(\.editMode, $editMode) .moveDisabled(false) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { EditButton() } ToolbarItem { Button(action: addItem) { Label("Add Item", systemImage: "plus") } } } } } func addItem() { withAnimation { let newItem = Item(timestamp: Date()) modelContext.insert(newItem) } } func deleteItems(offsets: IndexSet) { withAnimation { for index in offsets { modelContext.delete(items[index]) } } } } #Preview { ContentView() .modelContainer(for: Item.self, inMemory: true) } code-block
2
0
113
3d
I can't stand IOS 18 photos app
I made an account on this site for the sole reason to post this. I can not stand the IOS 18 photo app, to put it bluntly its sucks, it's made the app unusable. I was nice, I'd thought I'd give it a month or two but no, it still sucks. I wish I could uninstall IOS 18 solely cause of it. I hate the UI, its utterly unintuitive.
1
0
108
4d
SwiftUI TextSelection crash on macOS
I have a very simple SwiftUI app, works fine on iOS, crashes on macOS: struct ContentView: View { @State var testStr: String = "" @State var selection: TextSelection? = nil var body: some View { VStack { TextField("Test", text: $testStr, selection: $selection) .onChange(of: selection) {print("selection changed")} } .padding() } } • Start app, write something in the TextField and move the cursor around. iOS: "selection changed" Mac: nothing (Bug ?) • double click on some word both Mac and iOS: "selection changed" • write some more in the TextField iOS: selection changed Mac: crash Any idea what I am doing wrong? Gerriet.
2
0
116
4d
TipViewStyle not compiling
I'm creating a simple TipViewStyle based on sample code but it fails to compile. It displays: Type 'MyViewStyle' does not conform to protocol 'TipViewStyle' When I choose the Fix option, it adds this line: `type alias Body = type' What should the type be here? struct MyTipViewStyle: TipViewStyle { func makeBody(config: Configuration) -> some View { VStack { config.title config.message? } }
2
0
132
4d
MapKit - render a line above everything, including annotations
I have a map application that needs to show a line (representing a direct route) that is above everything, including annotations. This is important because the map has lots of annotations (possibly hundreds) and the line is representing a route from point to another. With that many annotations being on top the line / route is basically useless because you can't see it. I've looked at things like MKOverlayLevel but it only supports .aboveRoads or .aboveLabels. Is there a way to set the z-axis of a map overlay so that it truly is on top of everything else on the map, including annotations? And if not directly in MapKit, what other options might I have? Worth noting that I'm targeting 16.4 and above, so that's my limitation on this
0
0
97
4d
cocoapods
When I try to install cocoapods I get this error: [!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com/CocoaPods/CocoaPods/search?q=dlopen%28%2FLibrary%2FRuby%2FGems%2F2.6.0%2Fgems%2Fffi-1.12.2%2Flib%2Fffi_c.bundle%2C+0x0009%29%3A+tried%3A+%27%2FLibrary%2FRuby%2FGems%2F2.6.0%2Fgems%2Fffi-1.12.2%2Flib%2Fffi_c.bundle%27+%28mach-o+file%2C+but+is+an+incompatible+architecture+%28have+%27x86_64%27%2C+need+%27arm64e%27+or+%27arm64%27%29%29%2C+%27%2FSystem%2FVolumes%2FPreboot%2FCryptexes%2FOS%2FLibrary%2FRuby%2FGems%2F2.6.0%2Fgems%2Fffi-1.12.2%2Flib%2Fffi_c.bundle%27+%28no+such+file%29%2C+%27%2FLibrary%2FRuby%2FGems%2F2.6.0%2Fgems%2Fffi-1.12.2%2Flib%2Fffi_c.bundle%27+%28mach-o+file%2C+but+is+an+incompatible+architecture+%28have+%27x86_64%27%2C+need+%27arm64e%27+or+%27arm64%27%29%29+-+%2FLibrary%2FRuby%2FGems%2F2.6.0%2Fgems%2Fffi-1.12.2%2Flib%2Fffi_c.bundle&type=Issues If none exists, create a ticket, with the template displayed above, on: https://github.com/CocoaPods/CocoaPods/issues/new Be sure to first read the contributing guide for details on how to properly submit a ticket: https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md Don't forget to anonymize any private data! Looking for related issues on cocoapods/cocoapods... Searching for inspections failed: undefined method `map' for nil:NilClass robertsantovasco@iMac L1 demo % I typed "install pod". There's pages of errors above that. Here is my podfile: platform :ios, '9.0' target 'L1 demo' do Comment the next line if you don't want to use dynamic frameworks use_frameworks! pod 'RealmSwift' end Please help. Thank you.
0
0
80
4d
SwiftUI/WebKit Allowing popups and links
We are using an imbedded WKWebView in a SwiftUI view. There are links within the pages being viewed - they are company pages - and some link to other pages as well as open named (or unnamed) browser tabs. In our implementation, when there is a named (or unnamed) link to another browser tab, the view does not do anything. Any ideas on how to allow tabs to open in some manner and allow the users to access the links?
2
0
88
4d
Drag and drop from the Files app onto a List doesn't work anymore in iOS 18
Hi I think I found an issue with SwiftUI List on iOS 18.0 and 18.1 Using the ContentView from the code block below: if you try to drag and drop the globe image onto the blue rows, things work fine on both iOS 17 and 18 with either List or VStack. However if you first drag and drop the image onto the Files app and then drag the newly created PNG file back into our app, it won't work on iOS 18 with the blue row inside the List. Also there's no visual feedback when hovering that blue row (unlike the one inside the VStack). I've tried various view modifiers but no luck so far. Any help is appreciated. Thank you. FB15618535 struct ContentView: View { var body: some View { VStack { Image(systemName: "globe") .resizable() .scaledToFit() .frame(height: 100) .draggable(Image(systemName: "globe")) List { Color.gray .frame(height: 100) Color.blue .frame(height: 100) .dropDestination(for: Image.self) { _, _ in print("List dropped") return true } } VStack { Color.gray Color.blue .dropDestination(for: Image.self) { _, _ in print("VStack dropped") return true } } } .padding() } }
1
0
106
4d
SwiftUI Color Issue
I have ran into an issue that is illustrated by the code in the following GitHub repository. https://github.com/dougholland/ColorTest When a SwiftUI color originates from the ColorPicker it can be persisted correctly and renders the same as the original color. When the color originates from the MapFeature.backgroundColor, it is always rendered with the light appearance version of the color and not the dark appearance version. The readme in the GitHub repo has screenshots that show this. Any assistance would be greatly appreciated as this is affecting an app that is in development and I'd like to resolve this before the app is released. If this is caused by a framework bug, any possible workaround would be greatly appreciated also. I suspect it maybe a framework issue, possibly with some code related to the MapFeature.backgroundColor, because the issue does not occur when the color originates from the ColorPicker.
0
1
105
4d