【发布时间】:2020-11-12 07:35:46
【问题描述】:
我需要从 SwiftUI 中的 UIScrollView 拉取刷新功能。所以我有一个基本的UIViewRepresentable 将 UIKit 组件改编为 SwiftUI。但是通过使用UIHostingController,我无法离开屏幕导航,因为我猜它现在管理导航。查看 Apple 的文档,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()
}
}
}
【问题讨论】:
标签: ios swift uiviewcontroller swiftui uikit