gpt4 book ai didi

ios - 如何处理 UIViewControllerRepresentable 包装器内的 NavigationLink?

转载 作者:搜寻专家 更新时间:2023-11-01 05:43:26 27 4
gpt4 key购买 nike

所以我正在尝试创建一个自定义分页 scrollView。我已经能够创建该包装器,并且该包装器内的内容由一个自定义 View 组成。在那个自定义 View 中,我有两个 NavigationLink 按钮,按下时应该将用户带到两个不同的 View 。

那些 NavigationLink 按钮不起作用。

scrollViewWrapper 位于 NavigationView 内。我创建了一个测试按钮,它只是一个简单的按钮,而且似乎可以正常工作。所以有些事情我没有正确使用 NavigationLink 和自定义 UIViewControllerRepresentable

这是我使用自定义包装器的地方。

NavigationView {
UIScrollViewWrapper {
HStack(spacing: 0) {
ForEach(self.onboardingDataArray, id: \.id) { item in
OnboardingView(onboardingData: item)
.frame(width: geometry.size.width, height: geometry.size.height)
}
}
}.frame(width: geometry.size.width, height: geometry.size.height)
.background(Color.blue)
}

入职 View :

struct OnboardingView: View {
var onboardingData: OnboardingModel

var body: some View {
GeometryReader { geometry in
VStack(spacing: 10) {
Spacer()
Image("\(self.onboardingData.image)")
.resizable()
.frame(width: 300, height: 300)
.aspectRatio(contentMode: ContentMode.fit)
.clipShape(Circle())
.padding(20)

Text("\(self.onboardingData.titleText)")
.frame(width: geometry.size.width, height: 20, alignment: .center)
.font(.title)

Text("\(self.onboardingData.descriptionText)")
.lineLimit(nil)
.padding(.leading, 15)
.padding(.trailing, 15)
.font(.system(size: 16))
.frame(width: geometry.size.width, height: 50, alignment: .center)
.multilineTextAlignment(.center)
Spacer(minLength: 20)
if self.onboardingData.showButton ?? false {
VStack {
Button(action: {
print("Test")
}) {
Text("Test Button")
}
NavigationLink(destination: LogInView()) {
Text("Login!")
}
NavigationLink(destination: SignUpView()) {
Text("Sign Up!")
}
}
}

Spacer()
}
}
}
}

自定义的 ScrollView Wrapper 代码:

struct UIScrollViewWrapper<Content: View>: UIViewControllerRepresentable {
var content: () -> Content

init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}

func makeUIViewController(context: Context) -> UIScrollViewController {
let vc = UIScrollViewController()
vc.hostingController.rootView = AnyView(self.content())
return vc
}

func updateUIViewController(_ viewController: UIScrollViewController, context: Context) {
viewController.hostingController.rootView = AnyView(self.content())
}
}

class UIScrollViewController: UIViewController {

lazy var scrollView: UIScrollView = {
let view = UIScrollView()
view.isPagingEnabled = true
return view
}()

var hostingController: UIHostingController<AnyView> = UIHostingController(rootView: AnyView(EmptyView()))

override func viewDidLoad() {
super.viewDidLoad()

self.view.addSubview(self.scrollView)
self.pinEdges(of: self.scrollView, to: self.view)

self.hostingController.willMove(toParent: self)
self.scrollView.addSubview(self.hostingController.view)
self.pinEdges(of: self.hostingController.view, to: self.scrollView)
self.hostingController.didMove(toParent: self)
}

func pinEdges(of viewA: UIView, to viewB: UIView) {
viewA.translatesAutoresizingMaskIntoConstraints = false
viewB.addConstraints([
viewA.leadingAnchor.constraint(equalTo: viewB.leadingAnchor),
viewA.trailingAnchor.constraint(equalTo: viewB.trailingAnchor),
viewA.topAnchor.constraint(equalTo: viewB.topAnchor),
viewA.bottomAnchor.constraint(equalTo: viewB.bottomAnchor),
])
}

最佳答案

正如其他答案所述,将 NavigationLink 放在 UIViewControllerRepresentable 中存在问题。

我通过将我的 UIViewControllerRepresentable 和 NavigationLink 包装在一个 View 中并以编程方式从 UIViewControllerRepresentable 内部激活 NavigationLink 来解决这个问题。

例如:

struct MyView: View
{
@State var destination: AnyView? = nil
@State var is_active: Bool = false

var body: some View
{
ZStack
{
MyViewControllerRepresentable( self )

NavigationLink( destination: self.destination, isActive: self.$is_active )
{
EmptyView()
}
}
}

func goTo( destination: AnyView )
{
self.destination = destination
self.is_active = true
}
}

在我的例子中,我将 MyView 实例传递给 MyViewControllerRepresentable 正在包装的 UIViewController,并在单击按钮时调用我的 goTo(destination:AnyView) 方法。

我们的案例之间的区别在于我的 UIViewController 是我自己用 UIKit 编写的类(与 UIHostingController 相比)。在您使用 UIHostingController 的情况下,您可能会使用包含 destinationis_active 变量的共享 ObservableObject。您可以将 2 个 NavigationLink 更改为具有操作方法的 Button 更改 ObservableObject 的 destinationis_active 变量。

关于ios - 如何处理 UIViewControllerRepresentable 包装器内的 NavigationLink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57494891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com