SwiftUI: использование атрибута Published для отображения листа

Добрый вечер!

Я работаю над простым проектом, где у меня есть модель представления, в которой опубликовано логическое значение. Я хотел бы показать лист, когда это значение установлено. Однако функция листа используетBindingтип, тем временем у меня естьPublishedтип.

Можно ли как-то бороться с таким случаем? В случае, если я попытаюсь справиться с этим с помощью некоторых обратных вызовов иStateпеременная в объекте представления, это сделает архитектуру более грязной, поэтому я бы хотел этого избежать.

      
final class ContentViewModel: ObservableObject {
    @Published private(set) var isVisable = false
    func toggleVisability() {
        isVisable.toggle()
    }
} 

struct ContentView: View {
    @StateObject var model = ContentViewModel()

    var body: some View {
        VStack {
            Button("Show") {
                model.toggleVisability()                
            }
            .sheet(isPresented: model.$isVisable, // ERROR: Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>'
                   onDismiss: { model.toggleVisability() }) {
                Text("Placeholder")
            }
        }
    }
}

1 ответ

Опубликованная переменная должна быть общедоступной для установки, а привязка должна быть предоставлена ​​для самой модели (наблюдаемого объекта).

      final class ContentViewModel: ObservableObject {
    @Published var isVisable = false // CHANGE HERE
    func toggleVisability() {
        isVisable.toggle()
    }
} 

struct ContentView: View {
    @StateObject var model = ContentViewModel()

    var body: some View {
        VStack {
            Button("Show") {
                model.toggleVisability()                
            }
            .sheet(isPresented: $model.isVisable, // CHANGE HERE
                   onDismiss: { model.toggleVisability() }) {
                Text("Placeholder")
            }
        }
    }
}

Большое спасибо JoakimDanielson и lorem ipsum.

Другие вопросы по тегам