【问题标题】:prefersLargeTitles with a GroupedListStyle SwiftUI view带有 GroupedListStyle SwiftUI 视图的 prefersLargeTitles
【发布时间】:2020-04-17 07:06:33
【问题描述】:

我有一个父视图,我希望导航标题变大。然后我推送一个带有分组表视图的子视图,我希望导航标题为inline

这适用于 SwiftUI,但是当我的父母是带有 prefersLargeTitles = true 的 UIViewController 并且我推送 UIHostingController(rootView: ChildView()) 时,子导航栏标题会跳转

这是预期的行为(仅使用 SwiftUI)

这是从 UIKit 推送时的行为:

这是有效的 SwiftUI 代码

struct ParentView: View {
    var body: some View {
        NavigationView {
            Text("SwiftUI")
                .navigationBarItems(trailing: navigationButton)
                .navigationBarTitle("SwiftUI Parent", displayMode: .large)
        }
    }

    var navigationButton: some View {
        NavigationLink(destination: ChildView()) {
            Text("Push")
        }
    }
}

struct ChildView: View {
    let list = ["One", "Two", "Three"]
    var body: some View {
        List(list, id: \.self, rowContent: Text.init)
            .listStyle(GroupedListStyle())
            .navigationBarTitle("SwiftUI Child", displayMode: .inline)
    }
}

struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildView()
    }
}

这就是我如何从 UIKit 推送 SwiftUI 孩子

class ParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "UIKit Parent"

        let barItem = UIBarButtonItem(title: "Push", style: .plain, target: self, action: #selector(pushChild))
        navigationItem.rightBarButtonItem = barItem
        view.backgroundColor = UIColor.systemBackground
        navigationController?.navigationBar.prefersLargeTitles = true
    }

    @objc
    func pushChild(_ sender: Any) {
        let childViewController = UIHostingController(rootView: ChildView())
        navigationController?.pushViewController(childViewController, animated: true)

    }
}

【问题讨论】:

    标签: swiftui-list swiftui


    【解决方案1】:

    在推送之前将子视图控制器的navigationItem.largeTitleDisplayMode 设置为.never(即使它是 UIHostingController)。

    func pushChild(_ sender: Any) {
        let childViewController = UIHostingController(rootView: ChildView())
        childViewController.navigationItem.largeTitleDisplayMode = .never
        navigationController?.pushViewController(childViewController, animated: true)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 1970-01-01
      • 2020-02-08
      • 2021-10-16
      • 2019-11-16
      • 2021-08-21
      • 2020-09-13
      • 2020-07-03
      相关资源
      最近更新 更多