SwiftUI中Alert弹窗内Picker组件不显示问题求助
问题原因及解决方案
SwiftUI的Alert组件对内部可嵌入的视图类型有严格限制,它仅支持TextField、Button这类基础交互控件,像你用的带.menu样式的Picker和.graphical样式的DatePicker并不在Alert的支持范围内,这就是它们不显示的原因。
下面给你两种可行的解决办法:
方法一:使用ConfirmationDialog替代Alert
ConfirmationDialog是专门用于展示包含更多选择项的弹窗,支持嵌入Picker这类控件,用法和Alert类似:
struct ProjectsView: View { @State private var date = Date() @State private var project = "" @State private var user = "" let userList = ["Tom", "Anna", "Mike"] @State private var showingDialog = false // 替换原有的showingMessage var body: some View { NavigationStack { VStack { createBtn } } } private extension ProjectsView { var createBtn: some View { Button(action: { showingDialog = true }){ Text("Add project") } .confirmationDialog("Add project", isPresented: $showingDialog) { TextField("Project", text: $project) Picker(selection: $user, label: Text("User")) { ForEach(userList, id: \.self) { Text($0) } } .pickerStyle(.menu) DatePicker("Date", selection: $date, displayedComponents: [.date]) .datePickerStyle(.graphical) Button("Save", action: saveProject) Button("Cancel", role: .cancel) {} } message: { Text("Fill in project details") } } func saveProject() { // 在这里编写你的保存逻辑 } } }
方法二:使用Sheet自定义弹窗
如果需要更自由的布局样式,完全自定义弹窗内容,推荐用Sheet:
struct ProjectsView: View { @State private var date = Date() @State private var project = "" @State private var user = "" let userList = ["Tom", "Anna", "Mike"] @State private var showingSheet = false var body: some View { NavigationStack { VStack { createBtn } .sheet(isPresented: $showingSheet) { // 自定义弹窗内容 NavigationStack { VStack(spacing: 20) { TextField("Project", text: $project) .textFieldStyle(.roundedBorder) Picker(selection: $user, label: Text("User")) { ForEach(userList, id: \.self) { Text($0) } } .pickerStyle(.menu) .padding() DatePicker("Date", selection: $date, displayedComponents: [.date]) .datePickerStyle(.graphical) HStack { Button("Cancel", role: .cancel) { showingSheet = false } .buttonStyle(.bordered) Button("Save") { saveProject() showingSheet = false } .buttonStyle(.borderedProminent) } } .padding() .navigationTitle("Add project") .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Cancel") { showingSheet = false } } ToolbarItem(placement: .confirmationAction) { Button("Save") { saveProject() showingSheet = false } } } } } } } private extension ProjectsView { var createBtn: some View { Button(action: { showingSheet = true }){ Text("Add project") } } func saveProject() { // 编写保存逻辑 } } }
注:你的原代码缺少showingMessage的@State定义和saveProject函数实现,上述示例已补充这些内容。
内容的提问来源于stack exchange,提问作者Der_Knappe
相关产品推荐
相关产品推荐

