SwiftUI显示警报的问题–将不显示警报框

时间:2020-07-06 01:39:41

标签: swift swiftui alert

我有以下代码:

@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())
    
    }

}

打印出以下输出:

  1. 点击退出按钮
  2. 。警报将显示

我希望显示警报框,并通过单击两个按钮之一来提示用户“取消”或“退出”。但是它永远不会显示或提示用户,这没有任何意义!?

有人看到我的代码有问题吗??这很简单,因为它应该很简单!

2 个答案:

答案 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。