是否可以使SwiftUI的导航标题可编辑?
不幸的是,navigationTitle
修饰符只接受Text
视图而不是TextField
视图。
我想这样做,而不仅仅是在导航栏下使用文本字段,因为我仍然希望在用户向下滚动时出现修改后的标题,并且无论您是否定义了标题,导航栏都会分配空间给导航标题。
是否可以使SwiftUI的导航标题可编辑?
不幸的是,navigationTitle
修饰符只接受Text
视图而不是TextField
视图。
我想这样做,而不仅仅是在导航栏下使用文本字段,因为我仍然希望在用户向下滚动时出现修改后的标题,并且无论您是否定义了标题,导航栏都会分配空间给导航标题。
现在navigationTitle
修饰符接受一个Binding<String>
参数,以及通常的基于String
的初始化器。
当使用绑定值并且导航栏处于内联形式时,标题会带有一个下拉菜单,其中包含一个重命名选项。 点击此选项允许用户编辑该视图的标题:
struct EditableTitleView: View {
@State private var title = "View Title"
var body: some View {
Text("Editable Title View")
.navigationTitle($title)
.navigationBarTitleDisplayMode(.inline)
}
}
虽然这不完全与始终使用文本字段相同的用户体验一致,但由于它是标准的SwiftUI实现,所以更容易实现。
您可以通过指定ToolbarItem
并将其放置在可能预期的标题位置上来在NavigationView中放置自定义视图,例如下面的代码。我添加了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
将视图推入堆栈,您希望在返回按钮和长按时显示堆叠视图列表中的有意义名称。struct TextFieldNavigationTitleView: View {
@State var mainTitle = "Main Menu"
@State var areaOneTitle = "Area One"
var body: some View {
NavigationView {
NavigationLink("App Area One", destination: areaOne)
.toolbar {
ToolbarItem(placement: .principal) {
TextField("Navigation Title", text: $mainTitle)
}
}
}
}
var areaOne : some View {
Text("AREA ONE")
.toolbar {
ToolbarItem(placement: .principal) {
TextField("Area One Title", text: $areaOneTitle)
}
}
}
}
ToolbarTitleMenu
块(请参阅https://developer.apple.com/documentation/swiftui/toolbartitlemenu)。这将覆盖默认菜单,该菜单仅包含重命名选项 - 您可以通过在ToolbarTitleMenu中指定RenameButton()
来将其添加到自己的菜单中。 - undefined