You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 04:54:11