После того, как счетчик вращается и происходит логическое сохранение, значки моих вкладок исчезают, а шестеренку настроеIOS

Программируем под IOS
Ответить
Гость
 После того, как счетчик вращается и происходит логическое сохранение, значки моих вкладок исчезают, а шестеренку настрое

Сообщение Гость »


После исправления вложенной проблемы NavigationView (я исправил ее так, что в моем ContentView было только одно корневое навигационное представление), значки моих вкладок исчезают, а механизм настроек перестает отвечать на запросы после использования счетчика, и происходит логика сохранения. В чем может быть причина?

Я пытался создать собственную панель навигации для механизма настроек, но проблема не устранена. Что касается значков вкладок, я менял коды, но пока не нашел решения. Это мои коды, связанные с этой проблемой. Дайте мне знать, если хотите увидеть больше.
импортировать SwiftUI импортировать Firebase класс ViewRouter: ObservableObject { @Published varrefreshKey: UUID = UUID() перечисление Страница { case onboarding_1, SignupView, onboarding_2, onboarding_3, mainTabView, mainSettingsView, AnimatedPicker, упражнениеPage, group11ContainerView // Удалена точка в конце. } @Published var currentPage: Page = .onboarding_1 { DidSet { print("Перешел с \(oldValue) на \(currentPage)") } } } @основной структура MoveMintApp: Приложение { @StateObject var viewRouter = ViewRouter() в этом() { FirebaseApp.configure() } var body: некоторая сцена { ОкноГруппа { ContentView() // Используйте ContentView вместо MainTabView, поскольку он управляет маршрутизацией .environmentObject(viewRouter) .environmentObject(SelectedTabIndex()) .environmentObject(DateManager()) } } } //////// импортировать SwiftUI структура ContentView: Просмотр { @EnvironmentObject вар viewRouter: ViewRouter @State Private var RefreshKey: UUID = UUID() @State Private var selectedDifficulty: Difficulty = .easy @State частная переменная selectedExercisionName: String = "" var body: some View { НавигацияВью { переключить viewRouter.currentPage { случай .onboarding_1: Onboarding_1().id(viewRouter.refreshKey) случай .signupView: SignUpView() случай .onboarding_2: Регистрация_2() случай .onboarding_3: Регистрация_3() случай .mainTabView: MainTabView() случай .mainSettingsView: MainSettingsView().environmentObject(viewRouter) случай .animatedPicker: АниматедПиккер() случай .group11ContainerView: Group11ContainerView(exercisionLog: PracticeLog.shared).environmentObject(viewRouter) случай.exercisionPage: УпражнениеPage (сложность: выбранная сложность, имя упражнения: $chosenExercisionName).environmentObject (viewRouter) } } } } ///////// импортировать SwiftUI класс SelectedTabIndex: ObservableObject { @Published индекс переменной: Int = 0 } класс DateManager: ObservableObject { @Published var selectedDate: Date = Date() } структура MainTabView: Просмотр { @EnvironmentObject var selectedTabIndex: SelectedTabIndex @EnvironmentObject var dateManager: DateManager @StateObject var viewRouter = ViewRouter() @State Private var showSettings: Bool = false // Состояние представления листа частный let customGreen = Цвет (шестнадцатеричный: «7BB38C») var body: some View { ВСтек { CustomNavigationBar(title: «Основная вкладка», TrailingAction: { showSettings.toggle() }) TabView(выбор: $selectedTabIndex.index) { АниматедПиккер() .environmentObject(viewRouter) .tabItem { tabImage(с именем: «Выполняется», forTab: 0) } .тег(0) Group11ContainerView (журнал упражнений: журнал упражнений.shared) .environmentObject(viewRouter) .environmentObject(DateManager()) .environmentObject(ExercisionLog.shared) .tabItem { tabImage(с именем: «Группа 11», forTab: 1) } .тег(1) } .accentColor(customGreen) .navigationBarBackButtonHidden(истина) .sheet(isPresented: $showSettings) { Основные настройкиView() .environmentObject(viewRouter) .environmentObject(SelectedTabIndex()) .environmentObject(DateManager()) } /*.sheet(isPresented: $showSettings) { // Представляем MainSettingsView в виде листа Основные настройкиView() .environmentObject(viewRouter) // Убедитесь, что viewRouter передан .environmentObject(SelectedTabIndex()) .environmentObject(DateManager()) */ } } частная функция tabImage (имя по имени: String, вкладка forTab: Int) -> какой-то просмотр { Изображение (имя) .renderingMode(.шаблон) .foregroundColor(selectedTabIndex.index == вкладка? customGreen: .gray) } } расширение Цвет { init (fromHex hex: String) { let hex = hex.trimmingCharacters (в: CharacterSet.alphanumerics.inverted) вар целое: UInt64 = 0 Сканер(строка: hex).scanHexInt64(&int) пусть r, g, b: UInt64 переключить hex.count { случай 6: // RGB (24 бита) (r, g, b) = (int >> 16, int >> 8 и 0xFF, int & 0xFF) по умолчанию: (г, г, б) = (123, 179, 140) } self.init( .sRGB, красный: Двойной(r)/255, зеленый: Дабл(г)/255, синий: Дабл(б)/255, непрозрачность: 1 ) } } ////////// импортировать SwiftUI импортировать Firebase структура MainSettingsView: Просмотр { @State Private var userName: String = "" // Это будет загружено из базы данных (например, Firebase) после регистрации. @State Private var NavigationToEditInfo: Bool = false @State Private var Profile Изображение: Изображение? // Заполнитель, вы должны получить его из источника данных. @State Private var NavigationToChangePasswordView: Bool = false @State Private var NavigationToLogoutView: Bool = false @State частная переменная isLogoutOverlayVisible: Bool = false @EnvironmentObject вар viewRouter: ViewRouter var body: some View { VStack(интервал: 20) { ZStack { Прямоугольник() .foregroundColor(.clear) .frame(ширина: 439, высота: 220) .background(Цвет(красный: 0,3, зеленый: 0,73, синий: 0,61)) .cornerRadius(30) .ignoresSafeArea() ВСтек { // Изображение профиля-заполнителя. если пусть userImage = ProfilePicture { пользовательское изображение .изменяемый размер() .scaledToFit() .frame(ширина: 100, высота: 100) .clipShape(Круг()) .padding(.top, 20) } еще { Изображение (имя системы: «person.circle.fill») .изменяемый размер() .scaledToFit() .frame(ширина: 100, высота: 100) .clipShape(Круг()) .padding(.top, 20) } HStack { TextField("", текст: $userName) .font(Font.custom("Спартанский", размер: 24).weight(.bold)) .foregroundColor(.white) .отключено(истина) .padding(.leading, 130) Кнопка(действие: { self.navigateToEditInfo.toggle() }) { Изображение («карандаш») .изменяемый размер() .scaledToFit() .frame(ширина: 20, высота: 20) .padding(.trailing, 130) } } .buttonStyle(PlainButtonStyle()) } } Кнопка(действие: { self.navigateToChangePasswordView.toggle() }) { HStack { Текст("Изменить пароль") .font(Font.custom("Спартанский", размер: 16)) .кернинг(0,48) .foregroundColor(.черный) .frame(ширина: 206, выравнивание: .leading) Разделитель() Изображение("шеврон") .frame(ширина: 10.2266, высота: 24) } } .buttonStyle(PlainButtonStyle()) // Гарантирует, что вся область кнопки доступна для нажатия Кнопка(действие: { self.isLogoutOverlayVisible.toggle() }) { HStack { Текст("Выход") .font(Font.custom("Спартанский", размер: 16)) .кернинг(0,48) .foregroundColor(.черный) .frame(ширина: 206, выравнивание: .leading) Разделитель() Изображение("шеврон") .frame(ширина: 10.2266, высота: 24) } } .buttonStyle(PlainButtonStyle()) .overlay( Группа { если isLogoutOverlayVisible { Выход из системыView( onConfirm: { print("Выполните выход здесь") self.isLogoutOverlayVisible.toggle() print("Вышел из системы!") }, onCancel: { self.isLogoutOverlayVisible.toggle() }, onLoggedOut: { // Здесь можно добавить дополнительную логику после выхода из системы }, isOverlayVisible: $isLogoutOverlayVisible ) .environmentObject(viewRouter) // Укажите здесь viewRouter } } ) Кнопка (действие: { print("Нажата кнопка "Вернуться к тренировке!") viewRouter.currentPage = .mainTabView print("Текущая страница после нажатия кнопки: \(viewRouter.currentPage)") }) { /* Text("Вернуться к упражнению") .шрифт( Font.custom("Спартанский", размер: 24) .вес(.тяжелый) ) .кернинг(0,72) .foregroundColor(.white) } .padding(.горизонтальный, 30) .padding(.вертикальный, 33) .frame(ширина: 360, высота: 79, выравнивание: .center) .background(Цвет(красный: 0,22, зеленый: 0,77, синий: 0,38)) .cornerRadius(20) .shadow(цвет: .black.opacity(0.08), радиус: 2, x: 0, y: 4)*/ } Разделитель() HStack { Текст("Условия использования") .font(Font.custom("Спартанский", размер: 12)) .кернинг(0.36) .подчеркивание() .foregroundColor(.черный) Текст("Частная политика") .font(Font.custom("Спартанский", размер: 12)) .кернинг(0.36) .подчеркивание() .foregroundColor(.черный) } } .padding() .sheet(isPresented: $navigateToEditInfo) { EditInfoPage().environmentObject(viewRouter) } .sheet(isPresented: $navigateToChangePasswordView) { ChangePasswordView().environmentObject(viewRouter) } .onAppear { выборкаИмяПользователя() } .navigationBarBackButtonHidden(истина) } // Функция fetchUserName() перемещена за пределы тела NavigationView. функция fetchUserName() { если пусть пользователь = Auth.auth().currentUser { // Здесь мы предполагаем, что отображаемое имя пользователя соответствует вашему желанию. Отрегулируйте по мере необходимости. self.userName = user.displayName ?? «Неизвестное имя» } } } структура MainSettingsView_Previews: PreviewProvider { статические предварительные просмотры var: some View { Основные настройкиView() } } /////////// импортировать SwiftUI структура CustomNavigationBar: Просмотр { пусть заголовок: Строка пусть TrailingAction: () -> Void var body: some View { HStack { Spacer() // Раздвигаем заголовок и кнопку в противоположные стороны Текст (название) .font(.headline) Разделитель() Кнопка (действие: TrailingAction) { Image("gear") // Предполагаем, что в ваших ресурсах есть изображение шестеренки } } .padding(.горизонтальный) .padding(.top, 20) // Добавляем место для строки состояния .background(Color.customGreen) } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»