SwiftUI中是否可以实现可编辑的navigationTitle导航栏标题?
SwiftUI 可编辑导航栏标题实现方案
可以实现,不需要自定义整个导航栏,也不需要在导航栏下方额外加输入框,完整保留原生导航栏的滚动切换、空间预留等默认行为。
核心实现逻辑
通过toolbar修饰器自定义.principal位置的工具栏项,替换原生标题展示,同时保留系统navigationTitle的占位逻辑。
完整示例代码
import SwiftUI struct EditableTitleDemo: View { @State private var pageTitle = "默认标题" @Environment(\.navigationBarTitleDisplayMode) private var displayMode var body: some View { NavigationStack { // 滚动内容示例,滚动时会自动触发导航栏样式切换 List(0..<30) { index in Text("内容项 \(index)") } // 传入空字符串占位,保留系统导航栏的空间预留和滚动适配逻辑 .navigationTitle("") .navigationBarTitleDisplayMode(.automatic) .toolbar { ToolbarItem(placement: .principal) { TextField("请输入标题", text: $pageTitle) // 适配不同导航栏模式下的字体样式,匹配原生标题视觉效果 .font(displayMode == .large ? .largeTitle.bold() : .headline) .multilineTextAlignment(.center) // 去掉输入框默认边框,和原生标题视觉一致 .textFieldStyle(.plain) // 可选:输入完成回调 .onSubmit { print("标题已更新为:\(pageTitle)") } } } } } }
关键说明
- 不可省略
navigationTitle修饰器,传入空字符串即可触发系统的导航栏空间预留、滚动时标题样式自动切换逻辑 .principal位置的工具栏项本身就和原生标题位置完全对齐,会跟随导航栏的状态自动调整位置- 如需兼容iOS 15及更早版本,将
NavigationStack替换为NavigationView即可,其余逻辑保持不变 - 可按需给
TextField添加输入长度限制、输入校验等自定义逻辑,不影响导航栏原生行为
内容的提问来源于stack exchange,提问作者Isaak
相关产品推荐
相关产品推荐

