SwiftUI: запретить обновление представления при представлении листа - PullRequest
6 голосов
/ 07 февраля 2020

Я заметил, что SwiftUI полностью обновляет представление sh при добавлении модификатора sheet.

Допустим, у меня есть View, который отображает случайное число. Я ожидаю, что это значение будет независимым и не будет связано с логикой листа c (не меняется каждый раз, когда я открываю / закрываю лист), но каждый раз, когда лист представляется / отклоняется Текст меняется .

Так должно работать? Я не прав, что основной смысл @Sate заключается в обновлении только подключенных видов, но не всего стека? Как я могу запретить моему представлению обновляться при представлении модального окна?

struct ContentView: View {

    @State var active = false

    var body: some View {
        VStack {
            Text("Random text: \(Int.random(in: 0...100))")

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            Text("POP UP")
        }
    }
}

PS Вызовы ContentView * только 1012 * / onDisappear() и init().

Ответы [ 2 ]

4 голосов
/ 07 февраля 2020

Необходимо создать отдельное независимое от условий представление для достижения поведения при использовании sh, как показано ниже

struct RandomView: View {
    var body: some View {
        Text("Random text: \(Int.random(in: 0...100))")
    }
}

struct ContentView: View {

    @State var active = false

    var body: some View {
        VStack {
            RandomView()

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            Text("POP UP")
        }
    }
}

В этом случае RandomView не перестраивается, поскольку не зависит от active состояние.

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

Asperi sad:

Представление является структурой, типом значения, если какая-либо его часть изменилась, тогда изменилось все значение

Он абсолютно прав! Но для этого у нас есть государственные свойства. Когда представление воссоздается, значение состояния не изменяется.

Это должно работать, как вы ожидали

struct ContentView: View {

    @State var active = false
    @State var number = Int.random(in: 0 ... 100)
    var body: some View {
        VStack {
            Text("Random text: \(number)")

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            Text("POP UP")
        }
    }
}

В чем преимущество? Для простых вещей состояние / привязка - это лучшее решение, без всяких сомнений.

import SwiftUI

struct SheetView: View {
    @Binding var randomnumber: Int
    var body: some View {
        Button(action: {
            self.randomnumber = Int.random(in: 0 ... 100)
        }) {
            Text("Generate new random number")
        }
    }
}
struct ContentView: View {

    @State var active = false
    @State var number = Int.random(in: 0 ... 100)
    var body: some View {
        VStack {
            Text("Random text: \(number)")

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            SheetView(randomnumber: self.$number)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Теперь вы можете отклонить лист с созданием нового случайного числа или без него. Внешняя модель не требуется ...

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