Я пытаюсь настроить код 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