我有以下代码:
@State private var signoutAlert = false
var body: some View {
Button(action: {
self.signoutAlert = true
print("signout button clicked")
}) {
Text("Sign Out")
}
.alert(isPresented: $signoutAlert) {
print(".alert will display")
//
return Alert(title: Text("Sign Out"), message: Text("Are you sure you want to Sign Out?"), primaryButton: .destructive(Text("Sign Out")) {
print("Signing out....")
self.session.signOut()
self.presentationMode.wrappedValue.dismiss()
}, secondaryButton: .cancel())
}
}
打印出以下输出:
我希望显示警报框,并通过单击两个按钮之一来提示用户“取消”或“退出”。但是它永远不会显示或提示用户,这没有任何意义!?
有人看到我的代码有问题吗??这很简单,因为它应该很简单!
答案 0 :(得分:8)
当在视图层次结构更上一层的视图上有一个 .alert(...) 视图修饰符时,我遇到了这个问题。如果父视图定义了 .alert(),那么子视图的 .alert() 修饰符将不会显示它的警报。
就我而言,我将高级视图上的 .alert() 向下移动为触发它的按钮上的修饰符,现在两个警报都正确显示。例如:
struct HiddenWalrusView: View {
@State private var showAlert1 = false
@State private var showAlert2 = false
var body: some View {
VStack {
Button("Show Alert One") { showAlert1 = true }
.padding(20)
Button("Show Alert Two") { showAlert2 = true }
.padding(20)
.alert(isPresented: $showAlert2) {
// This alert never displays
Alert(title: Text("I am the Walrus"))
}
}
.alert(isPresented: $showAlert1) {
Alert(title: Text("I am the Egg Man"))
}
}
}
struct EggmanAndWalrusView: View {
@State private var showAlert1 = false
@State private var showAlert2 = false
var body: some View {
VStack {
Button("Show Alert One") { showAlert1 = true }
.padding(20)
.alert(isPresented: $showAlert1) {
Alert(title: Text("I am the Egg Man"))
}
Button("Show Alert Two") { showAlert2 = true }
.padding(20)
.alert(isPresented: $showAlert2) {
Alert(title: Text("I am the Walrus"))
}
}
}
}
答案 1 :(得分:1)
要使Alert
正常工作,请使用以下示例:
(我在macOS 10.15.7 Catalina上使用了Xcode 12)
import SwiftUI
struct ContentView : View {
@State private var showAlert = false
var alert: Alert {
Alert(title: Text("Alert Window"), message: Text("Hello World! "),
dismissButton: .default(Text("Dismiss")))
}
var body: some View {
Button(action: {
self.showAlert.toggle()
}) {
Text("Show Alert Window")
}
.alert(isPresented: $showAlert, content: { self.alert })
}
}
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
(使用Go to Folder...
Finder命令)
/* /Users/<userName>/Library/Developer/Xcode/DerivedData/ */
...并删除其中的所有已编译项目。
如果这样做没有帮助–请删除Xcode.app
和~/Library/Developer/
文件夹,然后从头开始安装Xcode 12。