Обновляет ли сортировка списка весь вид тела? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь настроить код SwiftUI после просмотра ключевой заметки WWDC + прочтения некоторых их руководств.

Однако я столкнулся с проблемой здесь и перепутал с тем, как работает View.

В приведенном ниже коде я хотел сначала создать кнопку, которая будет сортировать список ячеек (аналогично списку WWDC) в алфавитном порядке.

Поэтому я создал функцию sortPlaces (), которая будет запускаться при нажатии кнопки.

Все хорошо, пока:

Я также хотел создать «Избранную» карту, которая бы случайным образом выбрала 5 из доступных элементов в PlaceStore, затем, если я нажму на карту, она изменится на следующий элемент из 5 случайно выбранных.

Однако, когда я попытался нажать кнопку сортировки, список все равно попал в правильный порядок, но 5 случайно выбранных мест были «обновлены» и изменены - хотя я использовал разные переменные, которые, по моему мнению, не были бы связаны между собой друг с другом.

Мое текущее предположение связано с сортировкой списка, обновляется представление списка, а также весь просмотр тела - таким образом, функция getFiveRandomPlaces () перезапускается, и 5 случайно выбранных мест также изменяются.

struct ContentView : View {
    @State var sortMode = "default"
    @ObjectBinding var store = PlaceStore(places: placedata)
    let storeCopy = PlaceStore(places: placedata)

    var body: some View {
        NavigationView {
            List {
                Text("Featured")
                    .font(.title)
                    .bold()

                FeaturedCard(places: getFiveRandomPlaces(places: storeCopy.places))

                ForEach(store.places) { place in
                    PlaceCell(place: place)
                }
            }
            .navigationBarTitle(Text("Been There"))
            .navigationBarItems(trailing: Button(action: sortPlaces) {
                Text("Sort")
            })
            .listStyle(.grouped)
        }
    }

    func getFiveRandomPlaces(places: [Place]) -> [Place] {
        var placesArrayCopy = places
        var fiveRandomPlaces: [Place] = []
        for _ in 0 ..< 5 {
            let i = Int.random(in: 0 ..< placesArrayCopy.count)
            fiveRandomPlaces.append(placesArrayCopy[i])
            placesArrayCopy.remove(at: i)
        }
        return fiveRandomPlaces
    }

    func sortPlaces() {
        switch sortMode {
        case "default":
            store.places.sort { $0.name < $1.name }
            sortMode = "name"
        case "name":
            store.places.sort { $0.city < $1.city }
            sortMode = "city"
        case "city":
            store.places.sort { $0.country < $1.country }
            sortMode = "country"
        case "country":
            store.places.sort { $0.id < $1.id }
            sortMode = "default"
        default:
            store.places.sort { $0.id < $1.id }
            sortMode = "default"
        }
    }
}

Я ожидаю, что список все еще можно будет отсортировать, но 5 случайно выбранных мест / карт остаются прежними. Возможно ли это сделать?

Заранее спасибо:)

Предварительный просмотр приложения в симуляторе: Preview

1 Ответ

0 голосов
/ 10 июня 2019

короче: да

Я бы сказал, что это ожидаемое поведение. Поскольку ваше представление постоянно обновляется, когда что-то меняется (в вашем случае вызывая sortplaces ), вам, вероятно, не следует помещать бизнес-логику в само объявление представления.

Решение о том, какие у вас 5 случайных мест, нужно будет определить где-то еще, а не в поле зрения.

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