SwiftUI - 如何在列表中编辑行?
Posted
技术标签:
【中文标题】SwiftUI - 如何在列表中编辑行?【英文标题】:SwiftUI - How do I make edit rows in a list? 【发布时间】:2019-08-14 14:13:11 【问题描述】:我想使用 EditButton() 来切换编辑模式,并让我的列表行切换到编辑模式。我想在编辑模式中包含一个新按钮以打开模式。我什至无法获得 EditMode 值来切换行内容。
struct ContentView: View
@Environment(\.editMode) var isEditMode
var sampleData = ["Hello", "This is a row", "So is this"]
var body: some View
NavigationView
List(sampleData, id: \.self) rowValue in
if (self.isEditMode?.value == .active)
Text("now is edit mode") // this is never displayed
else
Text(rowValue)
.navigationBarTitle(Text("Edit A Table?"), displayMode: .inline)
.navigationBarItems(trailing:
EditButton()
)
【问题讨论】:
【参考方案1】:需要在List中设置editMode的环境值:
struct ContentView: View
@State var isEditMode: EditMode = .inactive
var sampleData = ["Hello", "This is a row", "So is this"]
var body: some View
NavigationView
List(sampleData, id: \.self) rowValue in
if (self.isEditMode == .active)
Text("now is edit mode")
else
Text(rowValue)
.navigationBarTitle(Text("Edit A Table?"), displayMode: .inline)
.navigationBarItems(trailing: EditButton())
.environment(\.editMode, self.$isEditMode)
您需要小心,确保.environment(\.editMode, self.$isEditMode)
在.navigationBarItems(trailing: EditButton())
之后。
【讨论】:
我是否正确假设这种方法有效,因为 editMode 环境变量最初设置为绑定到状态变量,该状态变量也最终接收由 EditButton 对环境变量所做的更改?如果是这样,这是一个非常有用的工具。 @ChuckH 是的,这基本上就是它的作用。;-)【参考方案2】:添加到@kontiki 答案,如果您更喜欢为editMode 使用布尔值以便更容易修改,请使用此@State
变量:
@State var editMode: Bool = false
并将.environment
修饰符修改为:
.environment(\.editMode, .constant(self.editMode ? EditMode.active : EditMode.inactive))
现在使用您自己的按钮切换到/从编辑模式非常简单:
Button(action:
self.editMode = !self.editMode
, label:
Text(!self.editMode ? "Edit" : "Done")
)
【讨论】:
以上是关于SwiftUI - 如何在列表中编辑行?的主要内容,如果未能解决你的问题,请参考以下文章
如何允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?