Использование свойств переменной @State в качестве привязок - PullRequest
1 голос
/ 07 мая 2020

Я выполняю несколько упражнений с SwiftUI и обнаружил то, что считаю ошибкой, но не уверен.

У меня следующий код:

import SwiftUI

struct ContentView: View {
    @State var errorMessage: String = ""

    var body: some View {
        Text("Hello, World!")
            .alert(
                isPresented: $errorMessage.isEmpty,
                content: {
                    Alert(
                        title: Text("Important message"),
                        message: Text("This is an important message"),
                        dismissButton: .default(Text("Ok")
                    ))
        })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Проблема в том, что строка isPresented: $errorMessage.isEmpty выдает ошибку компилятора с указанием

Невозможно присвоить свойству: isEmpty - свойство только для получения.

Это правильный подход к этому? Согласно Xcode, свойство .isEmpty имеет тип Binding<Bool>, что и ожидает функция .alert().

Заранее благодарим за помощь.

Ответы [ 2 ]

2 голосов
/ 12 мая 2020

Binding, который вы передаете в isPresented, должен быть изменяемым, поскольку это параметр inout. Свойство isEmpty для String доступно только для чтения, поэтому вы не можете использовать его в качестве Binding.

Однако вы можете создать собственный Binding<Bool>, который обертывает errorMessage.isEmpty следующим образом:

let shouldShowAlert = Binding<Bool>(
    get: { !self.errorMessage.isEmpty },
    set: { if !$0 { self.errorMessage = "" } }
)

И затем вам просто нужно передать эту привязку shouldShowAlert к .alert.

struct ContentView: View {
    @State var errorMessage: String = ""

    var body: some View {
        let shouldShowAlert = Binding<Bool>(
            get: { !self.errorMessage.isEmpty },
            set: { if !$0 { self.errorMessage = "" }
            }
        )

        return Text("Hello, World!")
            .alert(
                isPresented: shouldShowAlert,
                content: {
                    Alert(
                        title: Text("Important message"),
                        message: Text("This is an important message"),
                        dismissButton: .default(Text("Ok")
                    ))
        })
    }
}
1 голос
/ 07 мая 2020
.alert(
   isPresented: $errorMessage.isEmpty,
   content: {
   Alert(
      title: Text("Important message"),
      message: Text("This is an important message"),
      dismissButton: .default(Text("Ok")
))

Параметр isPresented является параметром inout. Это означает, что он хочет изменить значение на false после того, как предупреждение будет отклонено.

Единственная проблема заключается в том, что вы не можете указать String сделать это: "".isEmpty = false

Вы либо нужно новое значение привязки или создайте if statement, например:

@State var canIAlert = true
if $errorMessage.isEmpty {
   .alert(
      isPresented: canIAlert,
      content: {
      Alert(
         title: Text("Important message"),
         message: Text("This is an important message"),
         dismissButton: .default(Text("Ok")
   ))
}
...