gpt4 book ai didi

swiftui - UIKit > SwiftUI > UIKit 时未显示导航栏项目

转载 作者:行者123 更新时间:2023-12-04 13:10:24 27 4
gpt4 key购买 nike

从 SwiftUI View 推送到 UIKit 时,导航栏项目不存在或未添加。
我在 Storyboard中添加了一项,在代码中添加了一项,但都没有显示。
这可能是 SwiftUI 中的一个错误,但我觉得这可能是一个非常常见的情况,也许我遗漏了什么?
这个问题有一些重叠:Navigation Bar Items after push from SwiftUI to UIKit虽然我不确定它们是否相同
结果
Gif of simulator
输入
Storyboard

  • 没有代码,只有 Storyboard
  • 没有代码,只有 Storyboard
  • class MyHostingController: UIHostingController<SwiftUIView> {

    required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder, rootView: SwiftUIView())
    }
    }
    struct SwiftUIView: View {
    var body: some View {
    NavigationLink(
    destination: MyUIKitView(),
    label: {
    Text("Go to MyUIKitView")
    })
    }
    }
    3 和 4 之间的胶水
    struct MyUIKitView: UIViewControllerRepresentable {
    typealias UIViewControllerType = MyUIKitViewController

    func makeUIViewController(context: Context) -> MyUIKitViewController {
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let myVC = sb.instantiateViewController(identifier: "MyUIKitViewController") as! MyUIKitViewController
    return myVC
    }

    func updateUIViewController(_ uiViewController: MyUIKitViewController, context: Context) {
    print("♻️")
    }
    }
  • class MyUIKitViewController: UIViewController {

    override func viewDidLoad() {
    super.viewDidLoad()

    // 👋 ADD NAV BUTTON HERE
    navigationItem.rightBarButtonItems?.append(UIBarButtonItem(systemItem: .camera))
    }
    }
  • 没有代码,只有 Storyboard
  • 最佳答案

    SwiftUI View 使用自己的导航 Controller ,它忽略了 UIKit 导航 Controller ,因此可能的解决方案是将导航栏设置为父 Controller 并通过编码设置导航栏元素。
    像这样

    class MyUIKitViewController: UIViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    // 👋 ADD NAV BUTTON HERE - must be in DispatchQueue
    DispatchQueue.main.async {
    self.parent?.navigationItem.title = "Your Title"
    self.parent?.navigationItem.rightBarButtonItems?.append(UIBarButtonItem(systemItem: .camera))
    }
    }
    }
    另一种解决方案是使用 self.navigationController?.navigationBar.topItem? .这与上面的完全相同。它给出了一个 topItem。
    class MyUIKitViewController: UIViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    // 👋 ADD NAV BUTTON HERE - must be in DispatchQueue
    DispatchQueue.main.async {
    self.navigationController?.navigationBar.topItem?.title = "Your Title"
    self.navigationController?.navigationBar.topItem?.rightBarButtonItems?.append(UIBarButtonItem(systemItem: .camera))
    }
    }
    }
    我在 View 启动时使用了 DispatchQueue,此时未设置父级 . (您也可以使用 viewWillAppear 而不是 DispatchQueue.main.async )
    编辑
    如果您不想以编程方式添加元素,并且需要使用 Storyboard中的相同元素,则可以使用此方法。
    class MyUIKitViewController: UIViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    // 👋 ADD NAV BUTTON HERE
    navigationItem.rightBarButtonItems?.append(UIBarButtonItem(systemItem: .camera))

    DispatchQueue.main.async { //<--Here
    self.navigationController?.navigationBar.topItem?.title = self.navigationItem.title
    self.navigationController?.navigationBar.topItem?.rightBarButtonItems = self.navigationItem.rightBarButtonItems
    }
    }
    }

    关于swiftui - UIKit > SwiftUI > UIKit 时未显示导航栏项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66186411/

    27 4 0