首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI中的UIScrollView,使用UIHostingController导航的问题

SwiftUI中的UIScrollView,使用UIHostingController导航的问题
EN

Stack Overflow用户
提问于 2020-07-23 01:09:09
回答 1查看 626关注 0票数 1

我需要从SwiftUI中的UIScrollView刷新功能。因此,我对UIKit组件到SwiftUI的UIViewRepresentable适配有了一个初步的了解。但是通过使用UIHostingController,我不能离开屏幕导航,因为我猜它现在管理导航。查看苹果的文档,UIHostingController旨在用于将SwiftUI视图引入UIKit,而不是相反。但是从RefreshableScrollView中删除UIHostingController并不会在屏幕上呈现ScrollView。

有没有办法在没有导航问题或没有UIHostingController的情况下在SwiftUI中成功使用UIScrollView

代码语言:javascript
复制
// 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()
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-23 01:40:56

NavigationLinkNavigationView内部工作(watchOS除外),因此请按如下方式嵌入它

代码语言:javascript
复制
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")
       }
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63039635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档