prefersLargeTitles с представлением GroupedListStyle SwiftUI
У меня есть родительский вид, в котором я хочу, чтобы заголовок навигации был большим. Затем я нажимаю дочернее представление с представлением сгруппированной таблицы, и я хочу, чтобы заголовок навигации былinline
:
Это хорошо работает со SwiftUI, но когда мой родитель является UIViewController с prefersLargeTitles = true
и я нажимаю 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()
}
}
И вот как я выталкиваю ребенка SwiftUI из UIKit
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)
}
}
1 ответ
Решение
Установить дочерний контроллер представления navigationItem.largeTitleDisplayMode
к .never
перед тем, как его нажать (даже если это UIHostingController).
func pushChild(_ sender: Any) {
let childViewController = UIHostingController(rootView: ChildView())
childViewController.navigationItem.largeTitleDisplayMode = .never
navigationController?.pushViewController(childViewController, animated: true)
}