Мне нужно было то же самое для приложения, с которым я играю, и похоже, что 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 }
.