#ios #swift #swiftui #swiftui-navigationview
#iOS #swift #swiftui #swiftui-navigationview
Вопрос:
Мой проект SwiftUI отказывается отображать заголовок навигации после определенного момента. Я использую структуру навигации, которую я не видел реализованной ни в одном из примеров проектов, которые я видел, но для меня это имеет смысл и, похоже, работает до сих пор. Я подозреваю, что, поскольку я использую другую структуру навигации, это часть проблемы. Он .navigationBar
есть на каждой странице, но заголовок не отображается.
Я перепробовал много решений для переполнения стека и других. Я перепробовал все комбинации .navigationBarHidden(false)
.navigationBarTitle()
и .navigationBarBackButtonHidden(true)
на каждой странице, перечисленных ниже, без изменений. Я также перепробовал все места, которые мог придумать, чтобы разместить эти комбинации .navigationBar
модификаторов.
Недавно я обнаружил .toolbar
, и это тоже ничего не меняет. Я подозреваю, что (как видно из приведенных ниже фрагментов кода), поскольку NavigationView
он находится в первом представлении (WelcomeUI.swift), я не могу поместить .navigationBarTitle
его глубже в код.
Ниже приведена моя текущая структура навигации и фрагменты кода из каждого файла:
WelcomeUI.swift
struct WelcomeUI: View {
var body: some View {
NavigationView {
VStack {
//NavigationLink(destination: SignupUI(), label: {
//Text("Sign Up")
//}
NavigationLink(destination: LoginUI(), label: {
Text("Log In")
}
}
}
}
}
LoginUI.swift
struct LoginUI: View {
var body: some View {
VStack {
NavigationLink(destination: MainUI(), label: { Text("Log In") })
//Button(action: { ... }
}
.navigationBarHidden(false)
}
}
Примечание: SignupUI.swift по сути такой же, как LoginUI.swift
MainUI.swift
struct MainUI: View {
var body: some View {
TabView {
//SpendingView()
//.tabItem {
//Image(...)
//Text("Spending")
//}
//SavingView()
//.tabItem {
//Image(...)
//Text("Saving")
//}
//AddView()
//.tabItem {
//Image(...)
//Text("Add")
//}
//EditView()
//.tabItem {
//Image(...)
//Text("Edit")
//}
SettingsView()
.tabItem {
//Image(...)
Text("Settings")
}
}
.navigationBarBackButtonHidden(true)
}
}
Примечание: все представления в MainUI.swift структурированы одинаково.
SettingsView.swift
struct SettingsView: View {
var body: some View {
ZStack {
Form {
Section(header: Text("Section Header")) {
NavigationLink(destination: WelcomeUI()) {
Text("Setting Option")
}
}
Section {
//Button("Log Out") {
//self.logout()
//}
Text("Log Out")
}
}
.navigationBarTitle("Settings") // This has no effect on code no matter where it is place in SettingsView.swift
}
}
}
Я также должен отметить, что это влияет только на страницы после MainUI.swift. WelcomeUI.swift и LoginUI.swift работают, как и ожидалось.
Комментарии:
1. Пустое пространство может быть
NavigationView
поиском.toolbar
, чтобы поместить в него заголовок или что-то в этом роде. Кроме того, было бы лучше, если бы у вас был минимальный воспроизводимый код. Что-то, что, если кто-либо из нас скопирует и вставит, мы сможем сразу увидеть в моем холсте или симуляторе. Нет точек, звездочек, символов,View
которые не указаны. hackingwithswift.com/quick-start/swiftui /…2. Спасибо за советы @loremipsum. Я посмотрел
.toolbar
, и изменений тоже нет. У меня есть больше информации о том, что кажется проблемой, и я соответствующим образом обновлю сообщение.
Ответ №1:
Посмотрите на MainUI
navigationTitle
. Я просто вставил заголовок в каждый View
, чтобы узнать, что происходит.
import SwiftUI
struct SubSpendingView: View {
var body: some View {
ScrollView{
Text("SubSpendingView")
}.navigationBarTitle("SubSpending"
//, displayMode: .inline
)
}
}
struct SpendingView: View {
var body: some View {
ScrollView{
Text("SpendingView")
NavigationLink("subSpending", destination: SubSpendingView())
}.padding()
}
}
struct WelcomeUI: View {
var body: some View {
NavigationView {
VStack {
//NavigationLink(destination: SignupUI(), label: {
//Text("Sign Up")
//}
NavigationLink(destination: LoginUI(), label: {
Text("Go to Log In")
})
}.navigationTitle(Text("WelcomeUI"))
}
}
}
struct SettingsView: View {
var body: some View {
VStack{
ZStack {
Form {
Section(header: Text("Section Header")) {
NavigationLink(destination: WelcomeUI()) {
Text("Setting Option")
}
}
Section {
//Button("Log Out") {
//self.logout()
//}
Text("Log Out")
}
}
Button("say-high", action: {print("Hi")})
// This has no effect on code no matter where it is place in SettingsView.swift
}
}//.navigationBarTitle("Settings")
}
}
struct LoginUI: View {
var body: some View {
VStack {
NavigationLink(destination: MainUI(), label: { Text("Log In") })
//Button(action: { ... }
}.navigationTitle(Text("LoginUI"))
.navigationBarHidden(false)
}
}
struct MainUI: View {
@State var selectedTab: Views = .adding
var body: some View {
TabView(selection: $selectedTab) {
SpendingView()
.tabItem {
Image(systemName: "bag.circle")
Text("Spending")
}.tag(Views.spending)
//SavingView()
//.tabItem {
//Image(...)
//Text("Saving")
//}
Text("Adding View")
.tabItem {
Image(systemName: "plus")
Text("Add")
}.tag(Views.adding)
Text("Edit View")
.tabItem {
Image(systemName: "pencil")
Text("Edit")
}.tag(Views.edit)
SettingsView()
.tabItem {
Image(systemName: "gear")
Text("Settings")
}.tag(Views.settings)
}
//This overrides the navigationTitle in the tabs
.navigationBarTitle(Text(selectedTab.rawValue)
//, displayMode: .inline
)
.navigationBarBackButtonHidden(true)
}
}
enum Views: String{
case settings = "Settings"
case spending = "Spending"
case adding = "Add"
case edit = "Edit"
}
struct PaddyNav: View {
var body: some View {
WelcomeUI()
//Wont work
.navigationTitle(Text("PaddyNav"))
}
}
struct PaddyNav_Previews: PreviewProvider {
static var previews: some View {
PaddyNav()
}
}
Комментарии:
1. Это отличное начало! Я пошел дальше и внес изменения, которые вы предложили для каждого представления. Однако он работает так, как ожидалось, только для того, какой вид выбран в разделе
@State var selectedTab
inMainUI.swift
. Как я уже сказал, я добавил перечисления для каждого представления и пометил каждое представлениеMainUI.swift
. В каждом представлении, которое не являетсяselectedTab
, оно отображаетnavigationTitle
, но остается неподвижным, даже если вы прокрутите вниз. У вас есть решение, которое работает для каждого представления?2. Он остается неподвижным? Добавьте какой-нибудь код или фотографию.
3. Попробуйте это , в настоящее время у меня есть
AddView()
выбранный in@State var selectedTab: Views = .add
, а также соответствующие дополнения и теги enumMainUI
.4. Я не знаю, что вы подразумеваете под стационарным. Вы этого хотите
.inline
?5. Когда я прокручиваю представление вниз, заголовок должен переходить от
.large
к.inline
, единственное, что это делает, — это то, в каком представлении выбраноselectedTab
. Вы также заметите, что на второй фотографии онnavigationBar
прозрачный, а заголовок не.inline
отображается .