【Swift】アラートにAccentColorが適用されない

# はじめに
アラートにアクセントカラーが適用されてないことに気づきました
その対策を記事にしておきます

:::note warn
**追記(2024/1/11)**
筆者は記事を書いたとき、マルチモジュール構成のみで発生すると思っていましたが、
マルチモジュール構成とは関係がなく、常に発生しているようです。

https://x.com/noppefoxwolf/status/1745347816892125423?s=20

よって、本記事の再現手順でも再現しますが、ただプロジェクトを作成するだけでも再現するようです。
:::

# 再現手順
全体像はこんな感じです
![スクリーンショット 2023-11-07 22.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1b420615-ff46-9ce1-f782-38d8cb1dec3c.png)

メインプロジェクトのほうでAssetsにAccentColorを設定しています
![スクリーンショット 2023-11-07 22.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a397200b-46b3-92fa-94e3-3ee12676ff33.png)

以下のように`AppFeature`を実装しました
```AppFeature.swift
import SwiftUI

public struct AppFeature: App {
    @State private var isPresented = false
    
    public init() {}

    public var body: some Scene {
        WindowGroup {
            Button {
                isPresented.toggle()
            } label: {
                Text("アラート表示")
            }
            .alert("アラート", isPresented: $isPresented) {
                Button {
                    
                } label: {
                    Text("OK")
                }
            }
        }
    }
}
```

ButtonにAccentColorは効いているようです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/eeb1af9b-d039-21eb-5341-24e9f4582a57.png" width="50%">

しかし、アラートを表示してみるとボタンが青色で標準のAccentColorから変わってないことがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2efe36b8-3905-78a2-681a-d2b93e528da7.png" width="50%">

アラートのボタンを押したタイミングでAccentColorが反映されています。これは明らかにバグでしょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3fa77154-f0d6-c417-3d4c-eb000a2c9652.gif" width="50%">

# 解決方法1
```diff_swift
import SwiftUI

public struct AppFeature: App {
    @State private var isPresented = false
    
    public init() {
+      UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = UIColor(named: "AccentColor")
    }

    public var body: some Scene {
        WindowGroup {
            Button {
                isPresented.toggle()
            } label: {
                Text("アラート表示")
            }
            .alert("アラート", isPresented: $isPresented) {
                Button {
                    
                } label: {
                    Text("OK")
                }
            }
        }
    }
}
```

# 解決方法2
swiftui-introspectを使用します。

https://github.com/siteline/SwiftUI-Introspect

```diff_swift
import SwiftUI
import SwiftUIIntrospect

public struct AppFeature: App {
    @State private var isPresented = false
    
    public init() {}

    public var body: some Scene {
        WindowGroup {
            Button {
                isPresented.toggle()
            } label: {
                Text("アラート表示")
            }
            .alert("アラート", isPresented: $isPresented) {
                Button {
                    
                } label: {
                    Text("OK")
                }
            }
+          .introspect(.view, on: .iOS(.v15, .v16, .v17)) { view in
+               view.window?.tintColor = UIColor(named: "AccentColor")
+           }
        }
    }
}
```

# 解決後
最初から指定したAccentColorで表示されるようになりました
![Simulator Screen Recording - iPhone 15 - 2023-11-07 at 23.06.51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7aeac5b5-1ac5-a31c-e518-c451f310b74d.gif)

# おわり
これは早く治って欲しいですね