提问人:vc7 提问时间:11/17/2023 最后编辑:vc7 更新时间:11/17/2023 访问量:42
在 SwiftUI 中将内联搜索栏添加到导航栏时,如何防止 backBarButton 的标题消失
How to prevent a backBarButton's title disappear when add a Inline Search Bar to Navigation Bar in SwiftUI
问:
上下文
我们有一个在 UIKit 中构建的现有项目,现在我想在 SwiftUI 中创建一个新视图,搜索栏保留在导航栏上。
哪个搜索栏与 内联,所以显然修饰符不能满足我的要求。backBarButtonItem
searchable
问题
但是当我尝试做概念验证时。代码将位于此问题的最后一部分。
我发现,推出标题后,第一时间显示,然后在添加搜索栏时消失。这在经验上真的很糟糕。backBarButtonItem
我的问题
- 有什么办法解决吗?
- 为什么会有这样的行为?
[更新]
感谢 Sweeper 的提示,当我尝试将 更改为较短的字符串时,文本将保留在那里:barButtonTitle
// In ViewController's viewDidLoad
navigationItem.backButtonTitle = "A"
因此,新问题变得像
- 如何提高backBarButtonItem的抗压性
- 如何阻止 backButtonTitle 隐藏
我试图用我的新问题进行搜索,但没有得到任何有用的解决方案。如果使用 SwiftUI 和 UIKit 都很难做到这一点,我可以考虑并说服我们的设计师不要显示 .backButtonTitle
法典
UIKit 中的 ViewController
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
title = "Demo"
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didSelectCancel(sender:)))
}
@objc func didSelectCancel(sender: UIBarButtonItem) {
let hostingController = UIHostingController(rootView: MyView())
self.navigationController?.pushViewController(hostingController, animated: true)
}
}
SwiftUI 中的 MyView
import SwiftUI
struct MyView: View {
var body: some View {
ScrollView {
Text("Hello")
}
.toolbar {
ToolbarItem(placement: .principal) {
SearchBar(text: .constant("test"), placeholder: "test")
}
}
}
}
搜索栏
由于 SwiftUI 不提供独立的 SearchBar,因此我从文章中获取了一个 为 SwiftUI 创建搜索栏并在我的 PoC 中使用它
struct SearchBar: UIViewRepresentable {
@Binding var text: String
var placeholder: String
class Coordinator: NSObject, UISearchBarDelegate {
@Binding var text: String
init(text: Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
func makeCoordinator() -> SearchBar.Coordinator {
return Coordinator(text: $text)
}
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame: .zero)
searchBar.delegate = context.coordinator
searchBar.placeholder = placeholder
searchBar.searchBarStyle = .minimal
searchBar.autocapitalizationType = .none
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
答: 暂无答案
评论
self.navigationItem.backButtonTitle = ""
backButtonTitle
backBarButtonItem