Swift UI Удалить лишний список пустых ячеек без контроллера навигации - PullRequest
1 голос
/ 28 мая 2020

Swift UI - Xcode

Проблема: У меня есть лишние ячейки при инициализации моего списка. Однако, в отличие от других сообщений, у меня нет режима навигации. Обязательно ли иметь NavigationView для удаления лишних ячеек из моего списка.

Я пытался реализовать представление навигации, но не уверен, является ли он обязательным и как правильно реализовать.

.navigationBarTitle("List")
.listStyle(GroupedListStyle())

Я хотел бы начать новый текст или UIButton непосредственно под последней «текущей» ячейкой без лишних пробелов.

enter image description here

var body: some View {


    VStack(alignment: .leading) {


        Image("covidImage")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .cornerRadius(5)

        Text("COVID DATA")
            .font(.system(.title, design: .rounded))
            .bold()
            .lineLimit(3)
            .padding(.bottom, 3)
            .padding(.leading, 10)

        Text("Represented by Sate in the United States")
            .font(.subheadline)
            .foregroundColor(.secondary)
            .padding(.leading, 10)
            .padding(.bottom, 0)

        Text("Current State: CA")
        .font(.subheadline)
        .foregroundColor(.secondary)
        .padding(.leading, 10)
        .padding(.bottom, 10)

      //List to Initialize TableView Data
        List(covid) { covidData in
            Image(systemName: "photo")
                .padding()
            HStack {
                Text(covidData.dataTitle).frame(maxWidth: .infinity, alignment: .leading)

                Text(covidData.dataValue)
                    .font(.subheadline)
                .frame(maxWidth: .infinity, alignment: .trailing)
                    //.color(.gray)


            }


        }//END List


    }//END Original VStack



}//END Some View

1 Ответ

1 голос
/ 28 мая 2020

Это не пустые ячейки. List просто заполняет все доступное пространство, а dr aws пустые строки заполнители там, где нет содержимого. В вашем сценарии необходимо ограничить высоту List его содержимым.

Вот решение. Протестировано с Xcode 11.4 / iOS 13.4

Для лучшей наглядности давайте разделим ваш список в собственное представление с именем CovidDataList, тогда вот в вашем предоставленном body:

  //List to Initialize TableView Data
    CovidDataList(covid: self.covid)

    }//END List

Примечание 1: высота списка обновляется во время выполнения, поэтому его следует проверять в работающем приложении (не в предварительной версии)

Примечание 2: я тестировал с реплицированной моделью данных обложки, поэтому некоторая адаптация может необходимо для вашего кода

struct CovidDataList: View {
    @Environment(\.defaultMinListRowHeight) var minRowHeight

    let covid: [CovidData]
    @State private var listHeight = CGFloat.infinity

    var body: some View {
        List {
            ForEach(covid, id: \.self) { covidData in
                HStack {
                    Image(systemName: "photo")
                        .padding()
                    HStack {
                        Text("Title").frame(maxWidth: .infinity, alignment: .leading)

                        Text("Value")
                            .font(.subheadline)
                            .frame(maxWidth: .infinity, alignment: .trailing)
                    }
                }
                .listRowInsets(EdgeInsets()).padding(.horizontal)
            }
            .anchorPreference(key: BoundsPreferenceKey.self, value: .bounds) { [$0] }
        }
        .backgroundPreferenceValue(BoundsPreferenceKey.self) { rects in
            GeometryReader { gp in
                self.updateListFrame(gp: gp, anchors: rects)
            }
        }.frame(maxHeight: listHeight)
    }

    private func updateListFrame(gp: GeometryProxy, anchors: [Anchor<CGRect>]) -> some View {
        let contentHeight = anchors.reduce(CGFloat.zero) { $0 + gp[$1].size.height }
        DispatchQueue.main.async {   // << required !!
            self.listHeight = max(contentHeight, self.minRowHeight * CGFloat(self.covid.count))
        }
        return Color.clear
    }
}

Примечание: BoundsPreferenceKey взято из это мой ответ

...