排序列表会刷新整个“身体视图”吗?

时间:2019-06-10 10:32:29

标签: swift swiftui

在观看WWDC主题演讲+阅读他们的一些教程之后,我试图调整一些SwiftUI代码。

但是我在这里遇到了一个问题,并对View的工作方式感到困惑。

在下面的代码中,我想首先创建一个按钮,该按钮将根据字母顺序对单元格列表(类似于WWDC的列表)进行排序。

因此,我创建了sortPlaces()函数,该函数可以通过点击按钮来触发。

一切都很好,直到:

我还想创建一个“精选”卡片,该卡片将从PlaceStore中的可用元素中随机选择5个,然后,如果我点击该卡片,它将变为随机选择的5个元素中的下一个元素。 / p>

但是,当我尝试按排序按钮时,列表仍然按正确的顺序排列,但是随机选择的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 :(得分:0)

简而言之:是

我会说这是预期的行为。当某些更改(在您的情况下称为 sortplaces )发生变化时,由于视图不断更新,您可能不应将业务逻辑放入视图声明本身。

需要确定您的5个随机位置是什么,而不是在视图内部的其他地方。