Визуальные сбои в NavigationTitle - прозрачный и не меняющий состояние с .large на .inline при прокрутке

.navigationTitle на некоторых представлениях, похоже, имеет некоторые проблемы. В некоторых представлениях (и только в некоторых случаях) .navigationTitle не изменится с .large на .inline, как можно было бы ожидать. Вместо этого заголовок остается на месте при прокрутке вверх, а панель навигации полностью невидима (как показано на видео ниже). Это все воспроизводимо каждый раз.

Видео о воспроизводимых .navigationTitle ошибках

Я не нашел людей на переполнении стека или на форумах разработчиков Apple, которые сталкивались бы с этой конкретной проблемой. Есть люди, которые получили аналогичные результаты, как этот, но все они были исправлены путем удаления некоторого стилизационного кода для .navigationbar, из которого я не вносил никаких изменений в его нигде в моем коде.

Ниже приведены несколько фрагментов моего кода:

import SwiftUI
struct WelcomeUI: View { 
   var body: some View {
      NavigationView {
         VStack {
            //NavigationLink(destination: SignupUI(), label: {
               //Text("Sign Up")
            //}
            NavigationLink(destination: LoginUI(), label: {
               Text("Log In")
            })
         }
      }
   }
}


struct LoginUI: View {
   var body: some View {
      VStack {
         
         NavigationLink(destination: MainUI(), label: { Text("Log In") })
         //Button(action: { ... }
      }
   .navigationBarHidden(false)
   }
}


struct MainUI: View {
    @State var selectedTab: Views = .add
    var body: some View {
        
        TabView(selection: $selectedTab) {
            SpendingView()
                .tabItem {
                    Image(systemName: "bag.circle")
                    Text("Spending")
                }.tag(Views.spending)
            Text("Adding View")
                .tabItem {
                    Image(systemName: "plus")
                    Text("Add")
                }.tag(Views.add)
            Text("Edit View")
                .tabItem {
                    Image(systemName: "pencil")
                    Text("Edit")
                }.tag(Views.edit)
            SettingsView()
                .tabItem {
                    Image(systemName: "gear")
                    Text("Settings")
                }.tag(Views.settings)
        }
        .navigationBarTitle(Text(selectedTab.rawValue))
        .navigationBarBackButtonHidden(true)
    }
}


enum Views: String {
    case spending = "Spending"
    case add = "Add"
    case edit = "Edit"
    case settings = "Settings"
}


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")})
            }
        }
    }
}

struct SpendingView: View {
    var body: some View {
        ScrollView{
            Text("SpendingView")
            NavigationLink("subSpending", destination: SubSpendingView())
        }.padding()
    }
}
struct SubSpendingView: View {
    var body: some View {
        ScrollView{
            Text("SubSpendingView")
            
        }.navigationBarTitle("SubSpending")
    }
}

Это почти похоже на ошибку в самом SwiftUI только потому, что отключение центра управления заставляет его работать, но без анимации (как видно на видео). Кроме того, изменение того, какое представление выбрано первым в @State var selectedTab: Views, похоже, позволяет выбранному представлению работать должным образом, но приводит к нарушению работы остальных вкладок.

Когда я создаю и запускаю приложение на своем iPad, оно ведет себя так, как ожидалось, без ошибок, это происходит только при запуске на моем iPhone и симуляторе iOS на Mac, как это исправить?


person Dcfunkster    schedule 15.12.2020    source источник


Ответы (2)


Чтобы это работало безупречно, ScrollView должен быть прямым потомком NavigationView. У меня возникла аналогичная проблема с желанием закрыть TabView при навигации, но SwiftUI этого не допустит. Каждая вкладка должна быть NavigationView, и вам нужно творчески отклонить TabView, если вы этого хотите.

TabView {
    NavigationView {
        ScrollView {
            // your view here
        }
    }.tabItem {
        // tab label
    }
    
    // etc
}

По сути, представление навигации должно быть дочерним (в скобках) представления вкладки, а представление прокрутки должно быть прямым дочерним элементом представления навигации.

person BJ Beecher    schedule 16.12.2020
comment
Я также заметил, что проблема исчезает, если я запускаю приложение на своем iPad, но появляется снова, когда я запускаю его через свой iPhone или симулятор iOS. По этой причине я не могу представить, что это как-то связано с вашим ответом, но тем не менее я попробую. Я обновил сообщение, указав эту информацию. - person Dcfunkster; 16.12.2020
comment
Мне нужно больше пояснений относительно того, о чем вы говорите. Можете ли вы добавить пример кода (возможно, используя опубликованный мной пример кода) или лучше объяснить, где должны располагаться оболочки NavigationView? - person Dcfunkster; 16.12.2020
comment
Все еще не следишь за ходом твоих мыслей. Где разместить вкладки NavigationView {ScrollView {}}? Почему мне нужно закрыть TabView? И разве выдача представления TabView не приведет к тому, что вкладки не будут работать? Я не понимаю, каково ваше решение - person Dcfunkster; 21.12.2020
comment
Намного лучше спасибо. Я пытался сделать именно это в MainUI View, но происходит (ни один из элементов представления не отображается и приложение становится медленным и местами нестабильным). Я попробовал это с помощью всего NavigationView, выпуская ScrollView из вашего примера, и вот что происходит (просмотр элементов, отображение , но navigationTitle не меняет состояния). Вы также заметите, что то же самое произойдет, если вы примените свой код к моему примеру кода в моем вопросе. - person Dcfunkster; 21.12.2020
comment
Убедитесь, что вы не вкладываете NavigationViews. Это означает, что если WelcomeView является вашей точкой входа в приложение и вы переходите к своему tabview (который содержит NavigationViews), тогда NavigationView уже был объявлен, и повторное объявление вызовет ошибки. - person BJ Beecher; 21.12.2020
comment
Взгляните на мой ответ на этот вопрос о том, как выполнять навигацию вручную в SwiftUI. stackoverflow.com/questions/65333372/ - person BJ Beecher; 21.12.2020
comment
Оказывается, это был правильный ответ! Мне просто пришлось удалить оболочку NavigationView в представлении WelcomeUI и творчески обработать навигацию с помощью некоторых привязок. Спасибо! +1 - person Dcfunkster; 25.12.2020
comment
Нет проблем .. Рад, что смог помочь! - person BJ Beecher; 25.12.2020

Используйте navigationBarTitle("Title") и navigationBarBackButtonHidden(true) на дополнительном представлении TabView, а не на самом себе.

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                
            }
            .navigationBarTitle("Title")
            .navigationBarBackButtonHidden(true)
        }
    }
}
person mahan    schedule 16.12.2020
comment
Я пробовал это довольно много раз в нескольких комбинациях и в разных местах. Решение, которое у меня есть в моем примере, - это единственный способ, который я нашел, чтобы вообще отобразить .navigationTitle. - person Dcfunkster; 21.12.2020