swift - SwiftUI 可编辑导航标题
问题描述
是否可以让 SwiftUI 的导航标题可编辑?不幸的是,navigationTitle
修饰符只接受Text
视图而不接受TextField
视图。我想这样做而不是只使用导航栏下方的文本字段,因为我仍然希望当用户向下滚动并且导航栏为导航标题分配空间时,修改后的标题内联显示在导航栏中的良好默认行为无论您是否定义一个。
解决方案
您可以将自定义视图放置在 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())
}
}
}
}
}
请注意,如果您还在navigationTitle
视图中添加了一个修饰符,它在 iOS 上的默认大样式仍将显示在工具栏下方,但如果它滚动离开页面,它会在消失时消失,而您的主要项目将保留在屏幕上。如果您设置.navigationBarTitleDisplayMode(.inline)
,则永远不会显示较大的样式标题。
我之所以提到这一点,是因为无论如何您都应该考虑为您的视图保留标题,原因如下:
- 如果
NavigationLink
将视图推送到堆栈上,您希望在后退按钮和长按时出现的堆栈视图列表中显示一个有意义的名称。 - 当您有一个没有标题的导航子视图时,我还没有检查 VoiceOver 会发生什么。你越多地覆盖原生行为,你就越需要考虑是否让你的应用程序比 SwiftUI 默认提供的更难访问。
推荐阅读
- python - Selenium 驱动程序:通过 xpath 查找元素;我如何解析 2 级表(即表中的表)
- mule - Mule CE Cluster环境下的文件读取
- amazon-web-services - 卓:增强清单文件和清单文件有什么区别?
- csv - 如何在我的 CSV 文件中用句号/句点替换每一秒换行符?
- javascript - 切换播放器后如何调用函数,它可以工作,但只能在 2 次调用时调用
- mariadb - MariaDB的时态数据表中如何使事务标识符版本一一递增
- html - 为什么在 lit-element 中有两组生命周期回调?
- outlook-addin - 将 Outlook.MailItem 正文和附件转换为 UTF8 或流
- multithreading - 协程 Scope、Suspend 和 withContext 查询
- mysql - 在列中查找作为其他值的子字符串的值