Swift 警报按钮的默认成员没有上下文类型错误

Swift 警报按钮的默认成员没有上下文类型错误,swift,swiftui,Swift,Swiftui,此示例代码显示单击按钮时表示警报的按钮 struct LoginView: View { ... @State private var showAlert = false var body: some View { NavigationView { VStack { ... Button("Login") { self.sho

此示例代码显示单击按钮时表示警报的按钮

struct LoginView: View {
    ...
    @State private var showAlert = false

    var body: some View {
        NavigationView {
            VStack {
                ...

                Button("Login") {
                    self.showAlert = true
                }
                .alert(isPresented: self.$showAlert) {
                    Alert(title: Text("Login error"), message: Text("detail message"), dismissButton: .default(Text("Ok")))  // this line report a error
                }
            }
            .navigationBarTitle("Login View")
        }
    }
}

但是,当我编译此代码时,如果没有上下文类型的错误消息,则无法解析对成员“default”的引用。如何修复此代码?

提供代码的项目在
iOS模拟器
iOS设备
中构建良好,没有任何错误<代码>画布模拟器也可以正常工作(我使用了Xcode 11.2.1和iOS 13.2.2)

尝试删除文件夹中的所有编译项目
DerivedData

在Finder中,按Cmd-Shift-G并转到:

~/Library/Developer/Xcode/DerivedData/

清理此文件夹的内容后,再次构建项目,它必须按预期工作。

我通过实验发现,Xcode提供了这种愚蠢的行为,因为在另一个代码路径中存在编译问题(它显示了您有编译错误,但不在适当的位置,这是此错误的根源)

我的解决方案是:

1) 评论内部所有内容

public var body: some View {
   . . . . . 
}
2) 成功构建项目

3) 按视图取消注释视图。每次取消注释后成功构建将帮助您找到真正错误的位置

例如,sendRequest函数出现问题

Button(
        action: {

            self.sendRequest(requestUrl: self.requestUrl!, requestData: self.requestData!, requestMethod: RequestMethod.GET, handler: { rd, sa, am in
                                        self.responseData = rd
                                        self.showingAlert = sa ?? false
                                        self.alertMessage = am
                                    })

        },
        label: { Text("Get Data") }
       )
       .alert(isPresented: $showingAlert) {
           Alert(title: Text("Important!"), message: Text("\(alertMessage!)"), dismissButton: .default(Text("Got it!")))
       }
       .buttonStyle()

Xcode在“警报…”行上显示了“警报按钮的默认成员没有上下文类型错误”错误,因为括号没有正确配对,所以我收到了此错误消息。您的代码可以工作,这些版本也可以工作:

.alert(isPresented: $showAlert) {
    Alert(title: Text("Title"),
          message: Text("An alert"),
          primaryButton: .default(Text("OK"), action: {
          }),
          secondaryButton: .cancel(Text("Cancel"), action: {
          })
    )
}
或者这个:

.alert(isPresented: $showAlert) {
    Alert(title: Text("Title"),
          message: Text("An alert"),
          primaryButton: .default(Text("OK")) {
          },
          secondaryButton: .cancel(Text("Cancel"))
    )
}

您提供的代码生成时没有错误。Xcode 11.2.1,iOS 13.2.2。此代码运行良好。