Режим редактирования в списке - PullRequest
0 голосов
/ 23 сентября 2019

Я реализовал список в своем приложении в режиме редактирования, поэтому я могу перемещать строки, перетаскивая маркер строки.Это отлично работает, но выглядит не очень хорошо, поскольку значок перемещения находится под содержимым строки (см. Снимок экрана).И это потому, что в режиме редактирования есть место для кнопки удаления.

Есть ли способ скрыть элементы в строке, когда вы находитесь в режиме редактирования?

Row in a list in Edit mode

Код для просмотра:

import SwiftUI
import Combine
import DateHelper

struct EggList: View {

    @EnvironmentObject var egg : Egg
    @State private var eggs = Egg.all()

    var body: some View {

        NavigationView {

            List {

                Image("Pantanal")
                    .resizable()
                    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 250)

                ForEach(eggs) { eggItem in
                    NavigationLink(destination: EggDayList(eggItem: eggItem)) {
                        CellRow(eggItem: eggItem)
                    }
                 }
                .onDelete(perform: delete)
                .onMove(perform: move)
            }

            .navigationBarItems(leading: EditButton(), trailing: NavigationLink(destination: Settings()){
                Text("Add Egg")})
            .navigationBarTitle(Text("Eggs"), displayMode: .inline)
        }
    }
    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 {

    @Environment(\.editMode) var editMode: Binding<EditMode>?

    let eggItem: Egg
    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)

            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)
            .isHidden(editMode?.wrappedValue.isEditing ?? false)

            Spacer()

            VStack(alignment: .trailing, spacing: 0) {

                Image(systemName: "info.circle")
                    .resizable()
                    .frame(width: 22, height: 22)
                    .foregroundColor(.accentColor)
                    .onTapGesture(count: 1) {
                        print("action")
                }
            }
            .isHidden(editMode?.wrappedValue.isEditing ?? false)

        }
        .listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
        .frame(height: 46, alignment: .leading)
        .padding(0)
    }
}

extension View {

    func isHidden(_ hidden: Bool) -> some View {
        if hidden {
            return AnyView(self.hidden())
        } else {
            return AnyView(self)
        }

    }
}

#if DEBUG
struct EggList_Previews: PreviewProvider {
    static var previews: some View {
        EggList()
    }
}
#endif

1 Ответ

0 голосов
/ 25 сентября 2019

Добавьте небольшое расширение для просмотра:

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)

к одному из стеков, которые вы считаете наименее важными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...