已更新工作代码。
我已经在我的应用程序中以“编辑”模式实现了一个列表,因此可以通过拖动行手柄来移动行。效果很好,但看起来不太好,因为移动图标位于行内容下方(请参阅屏幕转储)。这是因为“编辑”模式为删除按钮腾出了空间。
在“编辑”模式下,是否可以隐藏行中的元素?
视图的代码为:
import SwiftUI
import Combine
import DateHelper
struct EggList: View {
@EnvironmentObject var egg : Egg
@State private var eggs = Egg.all()
@State private var editMode: EditMode = .inactive
var body: some View {
NavigationView {
List {
Image("Pantanal")
.resizable()
.frame(height: 250)
ForEach(eggs) { eggItem in
NavigationLink(destination: EggDayList(eggItem: eggItem)) {
CellRow(eggItem: eggItem)
.environment(\.editMode, self.$editMode)
}
}
.onDelete(perform: delete)
.onMove(perform: move)
}
.navigationBarTitle(Text("Eggs"), displayMode: .inline)
.navigationBarItems(leading: EditButton(), trailing: NavigationLink(destination: Settings()){
Text("Add Egg")})
.environment(\.editMode, self.$editMode)
}
}
func delete(at offsets: IndexSet) {
eggs.remove(atOffsets: offsets)
}
func move(from source: IndexSet, to destination: Int) {
eggs.move(fromOffsets: source, toOffset: destination)
}
}
struct CellRow: View {
let eggItem: Egg
@Environment(\.editMode) private var editMode
var body: some View {
HStack(spacing: 8) {
Image(eggItem.species)
.resizable()
.frame(width: 48, height: 48)
.clipShape(Circle())
VStack(alignment: .leading, spacing: 0) {
Text("\(eggItem.species)")
.font(.footnote)
.lineLimit(1)
.padding(.top, -4)
Text("id-"+String(eggItem.eggNumber))
.font(.footnote)
.lineLimit(1)
.padding(0)
Text("\(eggItem.layDate.string(with: "dd-MM-yy"))")
.font(.footnote)
.lineLimit(1)
.padding(.bottom, -7)
}.frame(width: 90, alignment: .leading)
VStack(spacing: 2) {
Text("days")
.font(.footnote)
.padding(.top, 12)
Image(systemName: "\(eggItem.diffToday)"+".circle")
.resizable()
.frame(width: 40, height: 30)
.padding(.bottom, 12)
.foregroundColor(.red)
}.frame(width: 50, alignment: .leading)
VStack(spacing: 0) {
Text("prediction")
.font(.footnote)
.padding(.top, 14)
Text(formatVar1(getal: eggItem.calcWeights[eggItem.daysToPip-1].prediction)+"%")
.font(.title)
.padding(.bottom, 12)
}.frame(width: 80, alignment: .leading)
if !(self.editMode?.wrappedValue.isEditing ?? false) {
VStack(alignment: .leading, spacing: 0) {
Text("INC")
.font(.footnote)
.lineLimit(1)
.padding(.top, -4)
Text("37.3")
.font(.footnote)
.lineLimit(1)
.padding(0)
Text("30%")
.font(.footnote)
.lineLimit(1)
.padding(.bottom, -7)
}
.frame(width: 30, alignment: .leading)
}
Spacer()
VStack(alignment: .trailing, spacing: 0) {
Image(systemName: "info.circle")
.resizable()
.frame(width: 22, height: 22)
.foregroundColor(.accentColor)
.onTapGesture(count: 1) {
print("action")
}
}
}
.listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
.frame(height: 46, alignment: .leading)
.padding(0)
}
}
答案 0 :(得分:1)
您的问题是,当您按下EditButton时,editMode
变量没有更改。无论处于什么状态,在您的CellRow中,editMode
变量始终返回.inactive
。我不知道为什么,这可能是一个错误。
我遇到了同样的问题,但是我在这里找到了这个问题:SwiftUI - How do I make edit rows in a list?,它通过将editMode
环境值传递到私有@State
变量中来使用变通方法,该变量似乎可以正常工作。 / p>
这就是您需要做的:
@State private var editMode: EditMode = .inactive
添加到您的EggList视图。
这将创建一个状态变量,从现在开始将保持编辑模式。
.environment(\.editMode, self.$editMode)
之后的某个地方添加.navigationBarItems(...)
。
这会将
editMode
中的环境变量EggList
设置为上面的状态变量的绑定。
.environment(\.editMode, self.$editMode)
初始化程序之后直接添加CellRow(...)
。
这会将状态变量
editMode
插入到CellRow
的环境中,可以通过@Environment(\.editMode)
对其进行访问。
现在,您只需将一个元素包装在if语句中即可在编辑模式下将其隐藏:
if !self.editMode?.wrappedValue.isEditing ?? true {
VStack(alignment: .leading, spacing: 0) {
Text("INC")
.font(.footnote)
.lineLimit(1)
.padding(.top, -4)
Text("37.3")
.font(.footnote)
.lineLimit(1)
.padding(0)
Text("30%")
.font(.footnote)
.lineLimit(1)
.padding(.bottom, -7)
}
.frame(width: 30, alignment: .leading)
}
,或者根据需要继续使用LuLuGaGa的isHidden
扩展名:
.isHidden(self.editMode?.wrappedValue.isEditing ?? false)
答案 1 :(得分:0)
在View中添加一些扩展名:
extension View {
func isHidden(_ hidden: Bool) -> some View {
if hidden {
return AnyView(self.hidden())
} else {
return AnyView(self)
}
}
}
接下来将@Enviroment添加到您的CellRow:
@Environment(\.editMode) var editMode: Binding<EditMode>?
您将能够添加修饰符:
.isHidden(editMode?.wrappedValue.isEditing ?? false)
到您认为最不重要的堆栈之一。