Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting Xcode 15 default AccentColor

I'm following the instructions for setting a custom color on AccentColor in xcassets catalog: enter image description here

Made sure the build setting was in place: enter image description here

But none of the buttons in my app are affected by this color.

Instead I need to add this to see it in simulator:

WindowGroup {
    ContentView()
        .accentColor(.accent)
}

and I need to set this on every preview to see it in the preview system.

Example of button code I'm using, but I've tried every buttonStyle of button/navigationLink, none of them get the AccentColor tint color automatically, I still have to set this manually on every button:

Button {
    
} label: {
    Image(systemName: "plus")
        .font(.system(size: 40))
}
.buttonStyle(.borderedProminent)
.clipShape(Capsule())

I assumed the whole point of this asset was so I wouldn't need to do this? Is this a known issue or am I doing this wrong?

like image 487
William T. Avatar asked Sep 08 '26 18:09

William T.


1 Answers

Thanks to @Sweeper for his comments helping me with this.

I was able to track down what was causing this by creating a new project (which showed the global accent color fine) and slowly applying my current project's code to it.

The cause is something really crazy... seems to have to do with setting a Data value on a SwiftData property during initialization.

Here's the most basic example:

Code for @main app:

@main
struct test_accent_colorApp: App {
    var appManager = AppManager()

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(appManager.testDataModelContainer)
    }
}

Basically creating an AppManager class which creates some dummy SwiftData preview content.

App Manager class:

@Observable class AppManager {
    var testDataModelContainer: ModelContainer = previewContainer
}

All this does is initialize a test data container.

Preview container code:

@MainActor
let previewContainer: ModelContainer = {
    do {
        let container = try ModelContainer(
            for: Item.self,
            configurations: ModelConfiguration(isStoredInMemoryOnly: true)
        )
        let item = Item(timestamp: Date())
        container.mainContext.insert(item)
        return container
    } catch {
        fatalError("Failed to create container \(error)")
    }
}()

This is a global variable, just creates a single Item entry with the current date, nothing else.

Item Model:

@Model
final class Item {
    var timestamp: Date
    var image: Data?
    
    init(timestamp: Date) {
        self.timestamp = timestamp
        
        //Global tint works
        self.image = nil
        
        //Global tint doesn't work
//        self.image = UIImage(named: "placeholder.jpg")!.jpegData(compressionQuality: 1.0)!
    }
}

Here, it has just 2 properties. The Data? property is what causes Gobal Tint to break down.

Here is when I initialize the item.image to nil, global tint works: enter image description here

Here is when I initialize the item.image with an image from the app bundle: enter image description here

Link to sample project zip file if anyone is curious.

like image 79
William T. Avatar answered Sep 12 '26 19:09

William T.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!