首页 > 解决方案 > SwiftUI 可编辑导航标题

问题描述

是否可以让 SwiftUI 的导航标题可编辑?不幸的是,navigationTitle修饰符只接受Text视图而不接受TextField视图。我想这样做而不是只使用导航栏下方的文本字段,因为我仍然希望当用户向下滚动并且导航栏为导航标题分配空间时,修改后的标题内联显示在导航栏中的良好默认行为无论您是否定义一个。

标签: swiftswiftuitextfieldnavigationbarnavigationview

解决方案


您可以将自定义视图放置在 NavigationView 中可能预期标题所在的位置,方法是指定ToolbarItem放置值为 的 a .principal,例如在下面的代码中。我添加了RoundedBorderTextFieldStyle以使文本字段更加可见:

struct EditableTitleView: View {
  @State private var editableTitle: String = "My Title"
    var body: some View {
      NavigationView {
        Text("View with editable title")
          .toolbar {
            ToolbarItem(placement: .principal) {
              TextField("Title", text: $editableTitle)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            }
          }
      }
    }
}

标题栏中示例 TextField 的屏幕截图

请注意,如果您还在navigationTitle视图中添加了一个修饰符,它在 iOS 上的默认大样式仍将显示在工具栏下方,但如果它滚动离开页面,它会在消失时消失,而您的主要项目将保留在屏幕上。如果您设置.navigationBarTitleDisplayMode(.inline),则永远不会显示较大的样式标题。

我之所以提到这一点,是因为无论如何您都应该考虑为您的视图保留标题,原因如下:

  1. 如果NavigationLink将视图推送到堆栈上,您希望在后退按钮和长按时出现的堆栈视图列表中显示一个有意义的名称。
  2. 当您有一个没有标题的导航子视图时,我还没有检查 VoiceOver 会发生什么。你越多地覆盖原生行为,你就越需要考虑是否让你的应用程序比 SwiftUI 默认提供的更难访问。

推荐阅读