子画面 ( .sheet )
デフォルト動作は、シュッと下から出てきて重なって表示
呼び元
swift
struct ContentView: View {
@State private var openSheet: Bool = false // ★
var body: some View {
VStack {
Button("Open") {
openSheet = true // true/false で表示/非表示切り替わる
}
}
.sheet(isPresented: $openSheet) {
ChildView()
}
}
}
子画面
swift
struct InsertInfoView: View {
@Binding var openSheet: Bool // ★
@Environment(\.dismiss) var dismiss
var body: some View {
VStack {
Text("子画面")
Button("Close") {
openSheet = false // true/false で表示/非表示切り替わる
}
}
}
子画面もうちょっと必要なのを盛り込むと
swift
import SwiftUI
struct FolderRenameDialog: View {
@Environment(\.modelContext) private var modelContext
@Environment(\.dismiss) var dismiss
@Binding var folderPath: FolderPath?
@State private var orgName: String = ""
@State private var newName: String = ""
var body: some View {
NavigationStack {
Form {
Section {
Text(orgName)
.foregroundStyle(.secondary)
} header: {
Text("Before").textCase(.none)
}
Section {
TextField("Name", text: $newName)
} header: {
Text("After").textCase(.none)
}
}
.font(.subheadline)
.navigationTitle("Rename Folder")
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
#endif
.toolbar {
ToolbarItemGroup(placement: .primaryAction) {
Button("Save") {
// TODO: save ..
dismiss()
}
.disabled(!isModified)
}
ToolbarItemGroup(placement: .cancellationAction) {
Button("Cancel") {
dismiss()
}
}
}
}
.onAppear {
if let folderPath = folderPath {
orgName = folderPath.basename.trimmingCharacters(in: .whitespacesAndNewlines)
newName = folderPath.basename.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
}
var isModified: Bool {
let newName = newName.trimmingCharacters(in: .whitespacesAndNewlines)
if newName == "" || newName == orgName {
return false
}
return true
}
}