我需要从SwiftUI中的UIScrollView刷新功能。因此,我对UIKit组件到SwiftUI的UIViewRepresentable适配有了一个初步的了解。但是通过使用UIHostingController,我不能离开屏幕导航,因为我猜它现在管理导航。查看苹果的文档,UIHostingController旨在用于将SwiftUI视图引入UIKit,而不是相反。但是从RefreshableScrollView中删除UIHostingController并不会在屏幕上呈现ScrollView。
有没有办法在没有导航问题或没有UIHostingController的情况下在SwiftUI中成功使用UIScrollView
// ContentView.swift
struct ContentView: View {
var body: some View {
VStack {
GeometryReader { geometry in
RefreshableScrollView(size: geometry.size, refresh: self.refresh) {
Text("Placeholder text")
}
}
}
NavigationLink(destination: Text("Destination")) {
Text("Click me")
}
}
func refresh() {
print("refreshing")
}
}
// RefreshableScrollView.swift
import SwiftUI
import UIKit
struct RefreshableScrollView<Content: View>: UIViewRepresentable {
var width: CGFloat
var height: CGFloat
var refresh: () -> Void
var refreshViewController: UIHostingController<Content>
init(size: CGSize, refresh: @escaping () -> Void, @ViewBuilder content: () -> Content) {
self.width = size.width
self.height = size.height
self.refresh = refresh
self.refreshViewController = UIHostingController(rootView: content())
}
func makeUIView(context: Context) -> UIScrollView {
let scrollView = UIScrollView()
scrollView.refreshControl = UIRefreshControl()
scrollView.refreshControl?.addTarget(
context.coordinator,
action: #selector(Coordinator.handleRefreshControl(sender:)),
for: .valueChanged
)
refreshViewController.view.frame = CGRect(x: 0, y: 0, width: self.width, height: self.height)
scrollView.addSubview(self.refreshViewController.view)
return scrollView
}
func updateUIView(_ uiView: UIScrollView, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject {
var refreshScrollView: RefreshableScrollView
init(_ refreshScrollView: RefreshableScrollView) {
self.refreshScrollView = refreshScrollView
}
@objc func handleRefreshControl(sender: UIRefreshControl) {
self.refreshScrollView.refresh()
sender.endRefreshing()
}
}
}发布于 2020-07-23 01:40:56
NavigationLink在NavigationView内部工作(watchOS除外),因此请按如下方式嵌入它
var body: some View {
NavigationView {
VStack {
GeometryReader { geometry in
RefreshableScrollView(size: geometry.size, refresh: self.refresh) {
Text("Placeholder text")
}
}
NavigationLink(destination: Text("Destination")) {
Text("Click me")
}
}
}
}https://stackoverflow.com/questions/63039635
复制相似问题