🏆

[iOS] 同サイズのウィジェットを複数設置すると同じ内容が表示される件

2023/04/04に公開

ウィジェットの実装をしていて面白い挙動があったのでまとめてみます。
以下のようなコードで、ランダムにTextを表示するウィジェットを実装してみます。

struct SampleWidgetEntryView : View {
    let title = ["one", "two", "three", "four", "five"].randomElement()!

    var body: some View {
        Text(title)
    }
}

この View を表示するウィジェットを複数設置してみます。
各ウィジェットでランダムに取得した title が表示されるコードのため、ウィジェット毎に異なるタイトルが表示されることを想定していました。
しかし、実際には以下のように同じ title で表示されています。

おそらく、レイアウトとサイズが同じ場合、View のインスタンスが共有され、同じ内容が表示されるようになっていると考えられます。
ウィジェットはホーム画面に置かれるため、メモリの節約などが目的だと推測しています。
(正解を知っている方が居れば教えて下さい)

同じサイズ・レイアウトのウィジェットでも内容を変えたい場合は何かしらの工夫が必要ですので、そのような仕様は避けるのがベターだと思います。

Discussion