SwiftUIで表示されたビューのpopまたはdismissprogrammaticallyを作成する方法についての参照が見つかりませんでした。
唯一の方法は、モーダルにすでに統合されているスライドダウアクション(およびこの機能を無効にしたい場合はどうすればよいですか?)とナビゲーションスタックの[戻る]ボタンを使用することです。
誰かが解決策を知っていますか?これがバグなのか、それともこのままなのかわかりますか?
PresentationModeバインディングでvalue
を呼び出そうとするコンパイラの問題が発生しました。プロパティをwrappedValue
に変更すると、問題が解決しました。 value
-> wrappedValue
は言語の更新であると想定しています。このメモはチャックHの回答へのコメントとしてより適切だと思いますが、コメントするのに十分な担当者ポイントがありません。また、この変更を編集して提案しましたが、私の編集はコメントまたは回答としてより適切であるとして拒否されました。
あるいは、ボタンからプログラムで実行したくない場合は、ポップする必要があるときはいつでもビューモデルから放出できます。保存が完了するたびに値を変更する@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
}
}
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
)
}
}