Сохранение состояния навигации в SwiftUI ⇐ IOS
-
Anonymous
Сохранение состояния навигации в SwiftUI
У меня возникла проблема с сохранением состояния навигации в приложении iOS. У меня есть NavigationSplitView (боковая панель) со списком NavigationLinks. Каждая NavigationLink осуществляет переход к представлению с помощью NavigationStack и собственных NavigationLinks с NavigationDestinations и навигационным путем. Я хочу сохранить путь с помощью @ScenenStorage (после сериализации), чтобы при навигации с помощью боковой панели сохранялись состояния навигации представлений. к сожалению, я получаю следующее сообщение:
Примечание. Ссылки ищут места назначения в любом окружающем NavigationStack, а затем в том же столбце NavigationSplitView. NavigationLink представляет значение типа «String», но соответствующее объявление NavigationDestination отсутствует, видимое из местоположения ссылки. Ссылку невозможно активировать.
Примечание. Ссылки ищут пункты назначения в любом окружающем NavigationStack, а затем в том же столбце NavigationSplitView.
Навигация работает только один раз. И только перед навигацией через боковую панель.
Код выглядит следующим образом:
Основное представление:
var body: some View { НавигацияSplitView( боковая панель: { SidebarView() }, деталь: { HomeView()} ) } } Навигационные ссылки на боковой панели:
struct SidebarNavigationItem: View { опция var: строка значок переменной: строка вар назначение: Пункт назначения пусть arsColors = ARSColors.shared init(опция: строка, значок: строка, пункт назначения: пункт назначения) { self.option = опция self.icon = значок self.destination = пункт назначения } var body: some View { NavigationLink (пункт назначения: пункт назначения) { Этикетка { Текст (опция) .foregroundColor(arsColors.primary) } икона: { Изображение (имя системы: значок) .foregroundColor(arsColors.highlight) } } } } HomeView (это навигация, которую я хочу сохранить)
импортировать SwiftUI расширение [String]: RawRepresentable { общественная инициализация? (rawValue: String) { Guard let data = rawValue.data (с использованием: .utf8), пусть результат = попробовать? JSONDecoder().decode([String].self, from: data) еще { вернуть ноль } Я = результат } общественный вар rawValue: String { охранник пусть данные = попробовать? JSONEncoder().encode(сам), пусть результат = String (данные: данные, кодировка: .utf8) еще { возвращаться "[]" } вернуть результат } } структура HomeView: Посмотреть { @SceneStorage("navPath") var navPath: [String] = [] var body: some View { NavigationStack(путь: $navPath) { ВСтек { Разделитель() HStack { NavigationLink (значение: navPath) { WidgetView(widgetText: «Тестнавигация») } Разделитель() WidgetView(widgetText: "Wifget2") Разделитель() WidgetView(widgetText: «Виджет3») Разделитель() WidgetView(widgetText: "Widget4") Разделитель() WidgetView(widgetText: "Widget5") } .padding(.all) } .navigationTitle("Домой") .navigationDestination(for: [String].self) {navPath в Test4NavView(navPath: navPath) } } .onAppear(){ печать (навПат) } .onDisappear() { печать (навПат) } } } И, наконец, TestView
структура Test4NavView: Просмотр { var navPath: [Строка] @SceneStorage("input1") частная переменная input1: String = "" @SceneStorage("input2") частная переменная input2: String = "" @SceneStorage("input3") частная переменная input3: String = "" @SceneStorage("input4") частная переменная input4: String = "" var body: some View { VStack(выравнивание: .center) { TextField("Вход 1", текст: $input1) TextField("Вход 2", текст: $input2) TextField("Вход 3", текст: $input3) TextField("Вход 4", текст: $input4) } .onAppear(){ печать (навПат) } .onDisappear() { печать (навПат) } } }
Я ожидаю, что перейду к HomeView с помощью боковой панели, затем к Test4NavView из HomeView, затем к другому представлению с помощью боковой панели, затем вернусь к HomeView с помощью боковой панели, и в конечном итоге я попаду на Test4NavView
У меня возникла проблема с сохранением состояния навигации в приложении iOS. У меня есть NavigationSplitView (боковая панель) со списком NavigationLinks. Каждая NavigationLink осуществляет переход к представлению с помощью NavigationStack и собственных NavigationLinks с NavigationDestinations и навигационным путем. Я хочу сохранить путь с помощью @ScenenStorage (после сериализации), чтобы при навигации с помощью боковой панели сохранялись состояния навигации представлений. к сожалению, я получаю следующее сообщение:
Примечание. Ссылки ищут места назначения в любом окружающем NavigationStack, а затем в том же столбце NavigationSplitView. NavigationLink представляет значение типа «String», но соответствующее объявление NavigationDestination отсутствует, видимое из местоположения ссылки. Ссылку невозможно активировать.
Примечание. Ссылки ищут пункты назначения в любом окружающем NavigationStack, а затем в том же столбце NavigationSplitView.
Навигация работает только один раз. И только перед навигацией через боковую панель.
Код выглядит следующим образом:
Основное представление:
var body: some View { НавигацияSplitView( боковая панель: { SidebarView() }, деталь: { HomeView()} ) } } Навигационные ссылки на боковой панели:
struct SidebarNavigationItem: View { опция var: строка значок переменной: строка вар назначение: Пункт назначения пусть arsColors = ARSColors.shared init(опция: строка, значок: строка, пункт назначения: пункт назначения) { self.option = опция self.icon = значок self.destination = пункт назначения } var body: some View { NavigationLink (пункт назначения: пункт назначения) { Этикетка { Текст (опция) .foregroundColor(arsColors.primary) } икона: { Изображение (имя системы: значок) .foregroundColor(arsColors.highlight) } } } } HomeView (это навигация, которую я хочу сохранить)
импортировать SwiftUI расширение [String]: RawRepresentable { общественная инициализация? (rawValue: String) { Guard let data = rawValue.data (с использованием: .utf8), пусть результат = попробовать? JSONDecoder().decode([String].self, from: data) еще { вернуть ноль } Я = результат } общественный вар rawValue: String { охранник пусть данные = попробовать? JSONEncoder().encode(сам), пусть результат = String (данные: данные, кодировка: .utf8) еще { возвращаться "[]" } вернуть результат } } структура HomeView: Посмотреть { @SceneStorage("navPath") var navPath: [String] = [] var body: some View { NavigationStack(путь: $navPath) { ВСтек { Разделитель() HStack { NavigationLink (значение: navPath) { WidgetView(widgetText: «Тестнавигация») } Разделитель() WidgetView(widgetText: "Wifget2") Разделитель() WidgetView(widgetText: «Виджет3») Разделитель() WidgetView(widgetText: "Widget4") Разделитель() WidgetView(widgetText: "Widget5") } .padding(.all) } .navigationTitle("Домой") .navigationDestination(for: [String].self) {navPath в Test4NavView(navPath: navPath) } } .onAppear(){ печать (навПат) } .onDisappear() { печать (навПат) } } } И, наконец, TestView
структура Test4NavView: Просмотр { var navPath: [Строка] @SceneStorage("input1") частная переменная input1: String = "" @SceneStorage("input2") частная переменная input2: String = "" @SceneStorage("input3") частная переменная input3: String = "" @SceneStorage("input4") частная переменная input4: String = "" var body: some View { VStack(выравнивание: .center) { TextField("Вход 1", текст: $input1) TextField("Вход 2", текст: $input2) TextField("Вход 3", текст: $input3) TextField("Вход 4", текст: $input4) } .onAppear(){ печать (навПат) } .onDisappear() { печать (навПат) } } }
Я ожидаю, что перейду к HomeView с помощью боковой панели, затем к Test4NavView из HomeView, затем к другому представлению с помощью боковой панели, затем вернусь к HomeView с помощью боковой панели, и в конечном итоге я попаду на Test4NavView
Мобильная версия