Загрузите больше функциональности, используя SwiftUI - PullRequest
2 голосов
/ 07 июня 2019

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

var items: [Landmark]

Я использовал массив элементов, которые я добавляю в HStack, используя ForEach

ScrollView(showsHorizontalIndicator: false) {
    HStack(alignment: .top, spacing: 0) {
        ForEach(self.items) { landmark in
            CategoryItem(landmark: landmark)
        }
    }
}

Какое наилучшее из возможных решений для управления нагрузкой больше в SwiftUI без использования пользовательских действий, таких как кнопка loadmore.

1 Ответ

2 голосов
/ 07 июня 2019

Для этой цели лучше использовать ForEach и List

struct ContentView : View {
    @State var textfieldText: String = "String "
    private let chunkSize = 10
    @State var range: Range<Int> = 0..<1

    var body: some View {
        List {
            ForEach(range) { number in
                Text("\(self.textfieldText) \(number)")
            }
            Button(action: loadMore) {
                Text("Load more")
            }
        }
    }

    func loadMore() {
        print("Load more...")
        self.range = 0..<self.range.upperBound + self.chunkSize
    }
}

В этом примере каждый раз, когда вы нажимаете клавишу load, увеличивается диапазон свойств State.То же самое вы можете сделать для BindableObject.Если вы хотите сделать это автоматически, вероятно, вам следует прочитать о PullDownButton (я не уверен, работает ли он для PullUp)

UPD: В качестве опции вы можете загружать новые элементы, используя onAppearмодификатор в последней ячейке (в данном примере это статическая кнопка)

var body: some View {
        List {
            ForEach(range) { number in
                Text("\(self.textfieldText) \(number)")
            }
            Button(action: loadMore) {
                Text("")
                }
                .onAppear {
                    DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime(uptimeNanoseconds: 10)) {
                        self.loadMore()
                    }
            }
        }
    }

Имейте в виду, что диспетчеризация необходима, потому что без нее у вас будет ошибка «Обновление табличного представления, пока табличное представлениеобновление). Возможно, вы можете использовать другой асинхронный способ для обновления данных

...