web-dev-qa-db-ja.com

iOS SwiftUI:プログラムでビューをポップまたは閉じる

SwiftUIで表示されたビューのpopまたはdismissprogrammaticallyを作成する方法についての参照が見つかりませんでした。

唯一の方法は、モーダルにすでに統合されているスライドダウアクション(およびこの機能を無効にしたい場合はどうすればよいですか?)とナビゲーションスタックの[戻る]ボタンを使用することです。

誰かが解決策を知っていますか?これがバグなのか、それともこのままなのかわかりますか?

31
Andrea Miotto

PresentationModeバインディングでvalueを呼び出そうとするコンパイラの問題が発生しました。プロパティをwrappedValueに変更すると、問題が解決しました。 value-> wrappedValueは言語の更新であると想定しています。このメモはチャックHの回答へのコメントとしてより適切だと思いますが、コメントするのに十分な担当者ポイントがありません。また、この変更を編集して提案しましたが、私の編集はコメントまたは回答としてより適切であるとして拒否されました。

0
gacoler

あるいは、ボタンからプログラムで実行したくない場合は、ポップする必要があるときはいつでもビューモデルから放出できます。保存が完了するたびに値を変更する@Publishedをサブスクライブします。

struct ContentView: View {
    @ObservedObject var viewModel: ContentViewModel
    @Environment(\.presentationMode) var presentationMode

    init(viewModel: ContentViewModel) {
        self.viewModel = viewModel
    }

    var body: some View {
        Form {
            TextField("Name", text: $viewModel.name)
                .textContentType(.name)
        }
        .onAppear {
            self.viewModel.cancellable = self.viewModel
                .$saved
                .sink(receiveValue: { saved in
                    guard saved else { return }
                    self.presentationMode.wrappedValue.dismiss()
                }
            )
        }
    }
}

class ContentViewModel: ObservableObject {
    @Published var saved = false // This can store any value.
    @Published var name = ""
    var cancellable: AnyCancellable? // You can use a cancellable set if you have multiple observers.

    func onSave() {
        // Do the save.

        // Emit the new value.
        saved = true
    }
}
0
Dan Bodnar

SwiftUIのコアコンセプトは、データフローを監視することです。

@State変数を使用し、この変数の値を変更して、ポップと却下を制御する必要があります。

struct MyView: View {
    @State
    var showsUp = false

    var body: some View {
        Button(action: { self.showsUp.toggle() }) {
            Text("Pop")
        }
        .presentation(
            showsUp ? Modal(
                Button(action: { self.showsUp.toggle() }) {
                    Text("Dismiss")
                }
            ) : nil
        )
    }
}

0
WeZZard