SwiftUI - зависит от нескольких условий - PullRequest
0 голосов
/ 05 февраля 2020

Можно ли зависеть от нескольких условий в SwiftUI? Например, чтобы показать лист:

.sheet(isPresented: $stateA && $stateB, content: { ... }) // this is not working

Или известен другой подход?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

«Я могу только показать вам дверь ...» (c) Морфеус

Сегодня день перегруженных операторов: ^) - предыдущий был здесь , вот для вашего случая (протестировано с Xcode 11.3 +)

extension Binding where Value == Bool {

    static func &&(_ lhs: Binding<Bool>, _ rhs: Binding<Bool>) -> Binding<Bool> {
        return Binding<Bool>( get: { lhs.wrappedValue && rhs.wrappedValue }, 
                              set: {_ in })
    }
}

struct TestCustomBinding: View {
    @State private var isFirst = true
    @State private var isSecond = false
    var body: some View {
        VStack {
            Button("TestIt") {
                self.isSecond = true
            }
            .sheet(isPresented: $isFirst && $isSecond) {
                Button("CloseMe") {
                    // sheet MUST be closed explicitly via one of states !
                    self.isSecond = false 
                }
            }
        }
    }
}

0 голосов
/ 05 февраля 2020

нет, невозможно ! isPresented accept Binding, это означает, что состояние обновляется, если лист будет отклонен. Какое из состояний A, stateB нужно изменить? или они оба? Даже если кто-то попытается определить оператор &&, где левая и правая части - Binding, это очень плохая идея. Не пытайтесь сделать это!

Переместите логи c в вашу модель, лучше вне любого вида .

ОБНОВЛЕНИЕ (для Asperi)

это действительный код (с вашим добавочным номером)

struct ContentView: View {
    @State private var isFirst = true
    @State private var isSecond = false
    var body: some View {
        VStack {
            Button("TestIt") {
                self.isSecond = true
            }
            .sheet(isPresented: $isFirst && $isSecond) {
                Text("A")
            }
        }
    }
}

Попробуйте! Нажатие TestIt откроет лист. Нет кнопки «go назад», но вы можете отклонить ее с помощью хорошо известного жеста. И попробуйте снова нажать TestIt ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...