列表上的 SwiftUI EditButton 在 iOS 15 中停止工作

len*_*nny 8 listview swift swiftui ios15

我将 SwiftUI EditButton() 与 List() 一起使用,但它突然停止与 iOS15 一起使用。虽然我不使用包装式 NavigationView,但是它以前工作得很好。无论如何,使用 NavigationView 对我来说不是一个选择。

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试过使用@Environment(\\.editMode) var editMode但这也不起作用。无论环境编辑模式如何,列表都只会在右侧显示“移动”栏。

\n

编辑:我刚刚注意到的是,刷新(关闭并重新打开包含列表的视图)后,列表处于编辑模式。这是一个错误还是有一个有效的干净实现方法(不使用 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}\n
Run Code Online (Sandbox Code Playgroud)\n