【发布时间】:2020-05-27 16:39:46
【问题描述】:
我正在尝试使用带有两个 ForEach 循环的列表来创建收藏夹功能。当我单击按钮时,项目移动到正确的部分,但按钮图像和功能没有更新。我有什么遗漏或做错了吗?
如果我导航到另一个视图并返回,列表最初会正确呈现,但如果我单击按钮仍会显示相同的行为。
如果我使用两个具有完全相同设置的单独列表,一切正常,但在 UI 中看起来很奇怪,因为即使列表中没有项目,每个列表也占用相同数量的空间。
或者,有没有办法强制列表重绘作为按钮点击的一部分?
谢谢!
import SwiftUI
struct BusinessListView: View {
@EnvironmentObject var state: ApplicationState
var body: some View {
VStack{
List {
Section(header: Text("Favorites")) {
if(state.favorites.count == 0){
Text("No Favorites")
}
else {
ForEach(state.favorites, id: \.self) { favorite in
HStack{
Button(
action: {},
label: { Image(systemName: "heart.fill").foregroundColor(.red) }
)
.onTapGesture { self.toggleFavorite(business: favorite)}
Text("\(favorite.name)")
}
}
}
}
Section(header: Text("Other Businesses")) {
ForEach(state.others, id: \.self) { business in
HStack{
Button(
action: {},
label: { Image(systemName: "heart") }
)
.onTapGesture { self.toggleFavorite(business: business)}
Text("\(business.name)")
}
}
}
}
}
}
func toggleFavorite(business: Business){
if(state.favorites.contains(business)){
self.state.favorites = self.state.favorites.filter {$0 != business}
self.state.others.append(business)
}
else{
self.state.others = self.state.others.filter {$0 != business}
self.state.favorites.append(business)
}
sortBusinesses()
}
func sortBusinesses(){
self.state.favorites.sort {
$0.name < $1.name
}
self.state.others.sort {
$0.name < $1.name
}
}
}
【问题讨论】:
-
如果你给我们一个可重现的可编译的例子会很棒......stackoverflow.com/help/minimal-reproducible-example
-
@Chris - 如果您想看一下,这里是完整的代码。除了目前,它并没有做很多事情。 github.com/benbaran/tippler 。我将尝试创建一个不需要进行网络调用等的示例。
-
@Chris - 这是一个最小的可重现示例:github.com/benbaran/swift-ui-favorites-list。
-
期待回答 -> 我已经更正了
-
@Chris - 感谢您的帮助!但是,上面的答案实际上并不起作用。项目移动时,动作和图标不会改变。它看起来就是这样,因为 toggleFavorite() 方法将处理这两种情况。
标签: swiftui-list swiftui