在 SwiftUI 中将内联搜索栏添加到导航栏时,如何防止 backBarButton 的标题消失

How to prevent a backBarButton's title disappear when add a Inline Search Bar to Navigation Bar in SwiftUI

提问人:vc7 提问时间:11/17/2023 最后编辑:vc7 更新时间:11/17/2023 访问量:42

问:

上下文

我们有一个在 UIKit 中构建的现有项目,现在我想在 SwiftUI 中创建一个新视图,搜索栏保留在导航栏上。

哪个搜索栏与 内联,所以显然修饰符不能满足我的要求。backBarButtonItemsearchable

简化流程可以像这样简化enter image description here

问题

但是当我尝试做概念验证时。代码将位于此问题的最后一部分。

我发现,推出标题后,第一时间显示,然后在添加搜索栏时消失。这在经验上真的很糟糕。backBarButtonItem

enter image description here

我的问题

  1. 有什么办法解决吗?
  2. 为什么会有这样的行为?

[更新]

感谢 Sweeper 的提示,当我尝试将 更改为较短的字符串时,文本将保留在那里:barButtonTitle

// In ViewController's viewDidLoad
navigationItem.backButtonTitle = "A"

shorter backButtonTitle

因此,新问题变得像

  • 如何提高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
    }
}
iOS Swift SwiftUI

评论

1赞 Sweeper 11/17/2023
听起来你只是想在推送 SwiftUI 视图之前。self.navigationItem.backButtonTitle = ""
0赞 vc7 11/17/2023
不是我真正想要的,但是是的,这是调试这个的良好开端。我发现被隐藏的原因是因为标题长度。当我将其更改为单个字符时,它仍然存在。谢谢你的提示!backButtonTitle
0赞 vc7 11/17/2023
到目前为止,问题似乎变成了如何提高抗压性,我还没有找到任何方法,但我会更新我原来的问题。backBarButtonItem

答: 暂无答案