SwiftUI ForEach на основе State Int - PullRequest
       4

SwiftUI ForEach на основе State Int

1 голос
/ 26 февраля 2020

Я сохраняю значение Int как состояние в моем представлении. Когда я нажимаю кнопку, Int увеличивается на единицу. Это работает нормально, когда я печатаю свое значение типа int.

Теперь у меня есть ForEach l oop, который выполняет итерацию на основе этого Int. Когда я устанавливаю свое состояние на 2 по умолчанию, оно отлично работает в начале. Однако, когда я увеличиваю значение Int, мой ForEach больше не вызывается.

Я понимаю, что State перезагрузит мое фактическое представление. Он загружает только определенные c части?

Здесь я заявляю свое государство:

@State var s_countVenues   : Int = 2

Это ForEach, который я использую. Он работает в начале, однако изменение s_countVenues НЕ обновляет представление.

ForEach(0..<self.s_countVenues)
{_ in
    HStack(spacing: 0)
    {
        //here comes my view
    }
}

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

self.s_countVenues += 1

TL: DR:

Мое состояние Int равно за работой. Я могу увеличить и распечатать его внутри этикетки. Однако использование его в качестве Statement в ForEach не вызывает этот l oop снова после изменения.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Это не из-за состояния, это потому, что вы используете ForEach конструктор с константой Range, это документированная функция, поэтому не предполагается обновлять, поэтому она не обновляется. Самое простое решение заключается в следующем - использовать идентификатор, привязанный к вашему состоянию. Это просто указывает для движка рендеринга, что ForEach является новым, поэтому refre sh (протестировано с Xcode 11.2 / iOS 13.2)

ForEach(0..<self.s_countVenues)
{_ in
    HStack(spacing: 0)
    {
        //here comes my view
    }
}.id(s_countVenues)
1 голос
/ 26 февраля 2020

из документов Apple

extension ForEach where Data == Range<Int>, ID == Int, Content : View {

    /// Creates an instance that computes views on demand over a *constant*
    /// range.
    ///
    /// This instance only reads the initial value of `data` and so it does not
    /// need to identify views across updates.
    ///
    /// To compute views on demand over a dynamic range use
    /// `ForEach(_:id:content:)`.
    public init(_ data: Range<Int>, @ViewBuilder content: @escaping (Int) -> Content)
}

Итак, вы должны использовать (как предложено Apple)

struct ContentView: View {
    @State var counter = 0
    var body: some View {
        VStack {
            ForEach(0 ..< counter, id:\.self) { i in
                    Text("row: \(i.description)")
                }
            Button(action: {
                self.counter += 1
            }, label: {
                Text("counter \(counter.description)")
            })
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...