1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift UI】@Environment(\.dismiss)のせいでAppがフリーズする場合がある

Last updated at Posted at 2025-01-02

環境

  • Xcode 16.2
  • iOS 18.2

概要

下記のコードは、ネスト構造のNestedView内でNavigationLinkを使用し、同じNestedViewを再び表示するものとなっております。
最小限のViewModelと、@Environmentdismissが定義されていることが特徴ですが、こちらのコードがシミュレータ上でフリーズを引き起こし、メモリ使用量がみるみる上昇していくという挙動に遭遇しました。
例外が発生しないので発生箇所の特定が難しかったです。

import SwiftUI

struct ContentView: View {
    var body: some View {
        NestedView()
    }
}

struct NestedView: View {
    @Environment(\.dismiss) private var dismiss
    @State var viewModel: NestedViewModel

    init() {
        _viewModel = State(initialValue: NestedViewModel())
    }

    var body: some View {
        NavigationStack {
            NavigationLink {
                NestedView()
            } label: {
                Text(viewModel.str)
            }
        }
    }
}

@Observable
class NestedViewModel {
    var str = "Hello"
}


#Preview {
    ContentView()
}

解決策

@Environment(\.presentationMode) を使用する

己の力で調べましたが、根本的な原因はわかりませんでした。
しかし、@Environment(\.dismiss) private var dismissを削除するとこの問題は発生しなくなりました。
そこで代わりに@Environment(\.presentationMode) private var presentationMode経由でdismissを呼び出すことでことなきを得ました。

この件について何か心当たりがある方、教えてください ><

あとがき

例外ではない謎の無限ループでシミュレータがフリーズしたときは@Environmentを疑った方がいいかもですね…

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?