SwiftUI повторно отображает код внутри для l oop после @State chage - PullRequest
0 голосов
/ 04 апреля 2020

Я написал небольшую программу в этой сущности https://gist.github.com/alfonsodev/411622f65727bd5f44eff13f6e7e0a9b

Нажав кнопки, вы можете правильно изменить значение playlistIndex, и пользовательский интерфейс обновится.

Напротив, l oop, который печатает каждый элемент списка воспроизведения, не обновляет, какой из них выбран, и использует ту же самую переменную playlistIndex

                ForEach(0..<playlist.count) {
                    if $0 == self.playlistIndex {
                        Text("? \(playlist[$0].title)")
                    } else {
                        Text(playlist[$0].title)
                    }
                }

I ожидал, что ForEach будет запускаться каждый раз при изменении @State, похоже, что он запускается в первый раз и содержит первое значение playlistIndex.

У меня вопрос, как мне печатать зависимые от @State циклы?

1 Ответ

2 голосов
/ 04 апреля 2020

ForEach не refre sh, потому что диапазон не был изменен - ​​SwiftUI пытается оптимизировать перерисовку, проверяя на равенство ...

Используйте вместо этого, как показано ниже (если ваш список воспроизведения идентифицируемый)

ForEach(Array(playlist.enumerated()), id: \.element) { (i, item) in
    if i == self.playlistIndex {
        Text("? \(item.title)")
    } else {
        Text(item.title)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...