len*_*nny 8 listview swift swiftui ios15
我将 SwiftUI EditButton() 与 List() 一起使用,但它突然停止与 iOS15 一起使用。虽然我不使用包装式 NavigationView,但是它以前工作得很好。无论如何,使用 NavigationView 对我来说不是一个选择。
\nstruct Test: View {\n @State private var items: [String] = ["Item1", "Item2", "Item3"] // mock / demo\n \n var body: some View {\n VTile(padding: 0) {\n HStack {\n Text("Title")\n Spacer()\n }\n .overlay(EditButton())\n \n List {\n ForEach(items, id: \\.self) { item in\n HStack {\n Text(item)\n Spacer()\n }\n }\n .onDelete(perform: delete)\n .onMove(perform: move)\n }\n .listStyle(PlainListStyle())\n }\n }\n \n func move(from source: IndexSet, to destination: Int) {\n // ...\n }\n \n func delete(at offsets: IndexSet) {\n // ...\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我也尝试过使用@Environment(\\.editMode) var editMode但这也不起作用。无论环境编辑模式如何,列表都只会在右侧显示“移动”栏。
编辑:我刚刚注意到的是,刷新(关闭并重新打开包含列表的视图)后,列表处于编辑模式。这是一个错误还是有一个有效的干净实现方法(不使用 NavigationView 思想)。
\n解决方法:因此,我想出了以下解决方法,暂时解决了该问题,但在某些情况下可能会产生副作用。正如所观察到的,刷新列表会将其带入编辑模式。因此,当编辑模式切换时(例如通过观察 editMode 环境变量)手动强制重新渲染会带来所需的结果。要重新渲染任何 SwiftUI 元素,只需为其应用一个唯一的 ID。稍后更改该 id 将强制视图重新渲染。
\n@Environment(\\.editMode) var editMode\n@State private var updateId: UUID = UUID()\n// ...\nList { /* ... */\xc2\xa0}.id(updateId)\n// ...\nfunc toggleEditMode() {\n // toggle edit mode\n editMode.toggle()\n\n // force update\n updateId = UUID() // <------- update the list\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |