SwiftUI中addRestaurant函数动态向List添加项失效问题
问题根源
你当前编写的addRestaurant()是定义在ContentView外部的全局函数,没有访问权限操作ContentView内部被@State标记的restaurants状态数组,在全局函数内执行append操作根本碰不到SwiftUI正在监听的状态源,自然无法触发列表自动刷新。
修复步骤
- 把
addRestaurant函数移动到ContentView结构体内部,让函数和被监听的restaurants数组处于同一作用域 - 在函数内部实现数组追加逻辑,SwiftUI会自动感知
@State属性的变更,完成列表的刷新渲染,不需要额外手动调用刷新方法 - 删除原来定义在结构体外部的空的全局
addRestaurant函数,避免作用域冲突
修复后的完整可运行代码
import SwiftUI struct Restaurant: Identifiable { let id = UUID() let name: String let stars: String } struct RestaurantRow: View { var restaurant: Restaurant var body: some View { HStack { Image(systemName: "photo") Text("\(restaurant.name)") Text("Stars \(restaurant.stars)").foregroundColor(Color.yellow) } } } struct ContentView: View { @State var restaurants = [ Restaurant(name: "Joe's Original", stars: "5"), Restaurant(name: "The Real Joe's Original", stars: "4"), Restaurant(name: "Original Joe's", stars: "3") ] // 函数移到视图内部,可直接访问状态变量 func addRestaurant(){ // 替换成你需要的新增餐厅数据即可 let newItem = Restaurant(name: "New Joe's Diner", stars: "4") restaurants.append(newItem) } var body: some View { NavigationView{ List(restaurants) { restaurant in RestaurantRow(restaurant: restaurant) } .navigationBarItems( trailing: Button(action: addRestaurant, label: { Text("Add")})) .navigationTitle("Table View Playground") }.refreshable { restaurants.append(Restaurant(name: "Joe's", stars: "2")) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
补充说明:初学者阶段记住,所有需要修改@State状态的逻辑,都要放在持有该状态的视图结构体内部,否则无法触发SwiftUI的自动刷新机制。等后续熟悉视图模型、@Binding等特性后,再做逻辑拆分即可。
内容的提问来源于stack exchange,提问作者Simon Giesen
相关产品推荐
相关产品推荐

