Skip to main content

子画面 ( .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
}
}