Swift UI 将绑定传递给另一个视图以通过 init 发出警报

Posted

技术标签:

【中文标题】Swift UI 将绑定传递给另一个视图以通过 init 发出警报【英文标题】:Swift UI passing a binding to another view for alert with an init 【发布时间】:2021-04-15 23:34:17 【问题描述】:

我可以在没有初始化的情况下将绑定传递给另一个视图,并且它工作得很好。但是,如果我尝试使用具有 init 的视图,我将无法克服错误。

struct ContentView: View 
    // MARK: - PROPERTIES
    @State private var showAlert = false
    @State private var alert: Alert? = nil
    @State private var alertTitle = ""
    @State private var alertMessage = ""
    
    // MARK: - BODY
    var body: some View 
        VStack 
            Button(action: 
                alertTitle = "Alert 1"
                alertMessage = "From Main View"
                showAlert.toggle()
            , label: 
                Text("Show Parent Alert")
            )
            
            // MARK: - TESTVIEW1
            TestView1(showAlert: $showAlert, alert: $alert, alertTitle: $alertTitle, alertMessage: $alertMessage)
         // END:VSTACK
        .alert(isPresented: $showAlert, content: 
            Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("Close")))
        )
    


struct TestView1: View 
    // MARK: - PROPERTIES
    @Binding var showAlert: Bool
    @Binding var alert: Alert?
    @Binding var alertTitle: String
    @Binding var alertMessage: String
    
    // MARK: - BODY
    var body: some View 
        VStack 
            Button(action: 
                alertTitle = "Alert 2"
                alertMessage = "From TestView1"
                showAlert.toggle()
            , label: 
                Text("Show View-1 Alert")
            )
            
            TestView2(showAlert: $showAlert, alert: $alert, alertTitle: $alertTitle, alertMessage: $alertMessage)
         // END:VSTACK
    

这很好,但如果我有一个 init,我会收到错误“无法将 'Alert?.Type' 类型的值分配给类型 'Alert'”

struct TestView1: View 
    // MARK: - PROPERTIES
    @Binding var showAlert: Bool
    @Binding var alert: Alert?
    @Binding var alertTitle: String
    @Binding var alertMessage: String
    
    init(showAlert: Binding<Bool>, alert: Binding<Alert>, alertTitle: Binding<String>, alertMessage: Binding<String>) 
        self.showAlert = false
        self.alert = Alert?
        self.alertTitle = ""
        self.alertMessage = ""
    

【问题讨论】:

【参考方案1】:

如果您有一个接受 Binding 的 init,则需要将 Binding(而不是值)分配给 @Binding 属性。您可以使用 _ 前缀来做到这一点。

init(showAlert: Binding<Bool>, 
     alert: Binding<Alert>, 
     alertTitle: Binding<String>, 
     alertMessage: Binding<String>) 

   self._showAlert = showAlert
   self._alert = alert
   self._alertTitle = alertTitle
   self._alertMessage = alertMessage

【讨论】:

感谢您的回复。这样做的全部原因是这是我的单元格视图,并且我在父级中已经有一个 .alert 和 .sheet ,因此试图找到一种在子单元格视图中显示警报的方法。我按照您的指定进行切换,但出现错误无法将类型 'Binding' 的值分配给类型 'Binding 再次感谢。我必须设置为可选。在此之后我实际上正在通过另一个级别,但工作。希望操作表是相同的 init(commentVM: CommentViewModel, showAlert: Binding, alert: Binding, alertTitle: Binding, alertMessage: Binding)

以上是关于Swift UI 将绑定传递给另一个视图以通过 init 发出警报的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.1 - 如何将集合视图单元格的索引行传递给另一个视图控制器

Swift 3 - 在视图控制器之间传递数据,然后再传递给另一个 2

将 UI Thread 方法传递给另一个线程以在 C# 中调用

将 qr 图像传递给另一个视图控制器

以编程方式将文本字段值传递给另一个视图中的标签

在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器