Есть ли проблема с тем, как я структурирую свой проект SwiftUI, из-за которой .navigationTitle не отображается?

#ios #swift #swiftui #swiftui-navigationview

#iOS #swift #swiftui #swiftui-navigationview

Вопрос:

Мой проект SwiftUI отказывается отображать заголовок навигации после определенного момента. Я использую структуру навигации, которую я не видел реализованной ни в одном из примеров проектов, которые я видел, но для меня это имеет смысл и, похоже, работает до сих пор. Я подозреваю, что, поскольку я использую другую структуру навигации, это часть проблемы. Он .navigationBar есть на каждой странице, но заголовок не отображается.

Экран SettingsView.swift

Я перепробовал много решений для переполнения стека и других. Я перепробовал все комбинации .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 in MainUI.swift . Как я уже сказал, я добавил перечисления для каждого представления и пометил каждое представление MainUI.swift . В каждом представлении, которое не является selectedTab , оно отображает navigationTitle , но остается неподвижным, даже если вы прокрутите вниз. У вас есть решение, которое работает для каждого представления?

2. Он остается неподвижным? Добавьте какой-нибудь код или фотографию.

3. Попробуйте это , в настоящее время у меня есть AddView() выбранный in @State var selectedTab: Views = .add , а также соответствующие дополнения и теги enum MainUI .

4. Я не знаю, что вы подразумеваете под стационарным. Вы этого хотите .inline ?

5. Когда я прокручиваю представление вниз, заголовок должен переходить от .large к .inline , единственное, что это делает, — это то, в каком представлении выбрано selectedTab . Вы также заметите, что на второй фотографии он navigationBar прозрачный, а заголовок не .inline отображается .