swift 如何从UIViewControllerRepresentable内部替换NavigationView的返回按钮?

rsl1atfo  于 2023-03-22  发布在  Swift
关注(0)|答案(1)|浏览(120)

考虑一个UIVIewController,其中需要设置一个自定义后退按钮。原因是在返回之前,应该向用户显示一个确认对话框,在那里他们可以取消导航,以防意外点击后退按钮。如果用户确认,则应该执行UIVIewController中的方法。
UIVIewController被 Package 在UIViewControllerRepresentable中。在UIKit环境中,UIVIewController可以像这样替换后退按钮:

let button = UIButton(type: .system)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)

然而,由于视图控制器通过UIViewControllerRepresentable在SwiftUI NavigationView中呈现,因此我尝试将其设置为父视图控制器:

parent?.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)

这不起作用。事实上,它会导致2个后退按钮,原始按钮在左侧,自定义添加的按钮在右侧:

即使设置了UIViewControllerRepresentable.navigationBarItems(leading:),也会在原来的后退按钮上添加第二个按钮。
UIVIewController如何设置自定义后退按钮?

1cosmwyk

1cosmwyk1#

在展示视图中,隐藏UIViewControllerRepresentable的导航栏后退按钮。人们可能会认为这只删除了后退按钮,但如果没有其他导航项,整个导航栏都会被删除。为了避免这种情况,还添加了一个空的Text视图:

MyViewControllerWrapper
   .navigationBarBackButtonHidden(true)
   .navigationBarItems(leading: Text(""))

这将删除NavigationView的返回按钮,只留下自定义的添加按钮。但是现在,视图控制器不能再通过以下方式以编程方式关闭:

navigationController?.popViewController(animated: true)

因此,在UIViewControllerRepresentable中,presentationMode被传递给UIViewController

@Environment(\.presentationMode) var presentationMode
...
viewController.presentationMode = presentationMode

然后,在UIViewController中,当点击后退按钮时,视图将被关闭:

presentationMode?.wrappedValue.dismiss()

这是可行的,但我相信有一个更优雅的解决方案。

相关问题