Потяните вниз, чтобы обновить данные в SwiftUI - PullRequest
5 голосов
/ 07 июня 2019

Я использовал простой список данных, используя List.Я хотел бы добавить опускание, чтобы обновить функциональность, но я не уверен, что это лучший из возможных подходов.

Опускание, чтобы обновить представление, будет видно только тогда, когда пользователь пытается выполнить опускание из самого первого индекса, такого же какмы сделали в UITableView с UIRefreshControl в UIKit

Вот простой код для перечисления данных в SwiftUI.

struct CategoryHome: View {
    var categories: [String: [Landmark]] {
        .init(
            grouping: landmarkData,
            by: { $0.category.rawValue }
        )
    }

    var body: some View {
        NavigationView {
            List {
                ForEach(categories.keys.sorted().identified(by: \.self)) { key in
                    Text(key)
                }
            }
            .navigationBarTitle(Text("Featured"))
        }
    }
}

1 Ответ

7 голосов
/ 11 июня 2019

Мне нужно было то же самое для приложения, с которым я играю, и похоже, что SwiftUI API не включает в себя возможность управления обновлением для ScrollView с в это время.

Со временем API будет разрабатывать и исправлять подобные ситуации, но общий резерв для отсутствующей функциональности в SwiftUI всегда будет реализовывать структуру, которая реализует UIViewRepresentable. Вот быстрый и грязный вариант для UIScrollView с контролем обновления.

struct LegacyScrollView : UIViewRepresentable {
    // any data state, if needed

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UIScrollView {
        let control = UIScrollView()
        control.refreshControl = UIRefreshControl()
        control.refreshControl?.addTarget(context.coordinator, action:
            #selector(Coordinator.handleRefreshControl),
                                          for: .valueChanged)

        // Simply to give some content to see in the app
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 30))
        label.text = "Scroll View Content"
        control.addSubview(label)

        return control
    }


    func updateUIView(_ uiView: UIScrollView, context: Context) {
        // code to update scroll view from view state, if needed
    }

    class Coordinator: NSObject {
        var control: LegacyScrollView

        init(_ control: LegacyScrollView) {
            self.control = control
        }

        @objc func handleRefreshControl(sender: UIRefreshControl) {
            // handle the refresh event

            sender.endRefreshing()
        }
    }
}

Но, конечно, вы не можете использовать какие-либо компоненты SwiftUI в представлении прокрутки, не заключая их в UIHostingController и не сбрасывая их в makeUIView, а не помещая их в LegacyScrollView() { // views here }.

...