Как заменить текущий вид в SwiftUI?
Я разрабатываю приложение на SwiftUI.
У меня есть NavigationView, и у меня есть кнопки на панели навигации. Я хочу заменить текущий вид (который является результатом выбора TabView) другим.
В основном, когда пользователь нажимает кнопку "Изменить", я хочу заменить представление другим представлением, чтобы внести изменения, и когда пользователь закончит, предыдущий вид восстанавливается путем нажатия кнопки "Готово".
Я мог бы просто использовать переменную для динамического выбора представления, отображаемого в текущем представлении вкладки, но мне кажется, что это не "правильный способ" в SwiftUI. И таким образом я не мог применить визуальный эффект перехода.
Некоторые примеры кода, чтобы объяснить, что я ищу.
private extension ContentView {
@ViewBuilder
var navigationBarLeadingItems: some View {
if tabSelection == 3 {
Button(action: {
print("Edit pressed")
// Here I want to replace the tabSelection 3 view by another view temporarly and update the navigation bar items
}) {
Text("Edit")
}
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
TabView(selection: $tabSelection) {
ContactPage()
.tabItem {
Text("1")
}
.tag(1)
Text("Chats")
.tabItem() {
Text("2")
}
.tag(2)
SettingsView()
.tabItem {
Text("3")
}
.tag(3)
}.navigationBarItems(leading: navigationBarLeadingItems)
}
}
}
Спасибо
РЕДАКТИРОВАТЬ
У меня есть рабочая версия, в которой я просто обновляю переменную переключения в моем действии кнопки, которая заставляет мое представление отображать ту или иную вещь, она работает, но я не могу применить к ней какой-либо эффект анимации, и она выглядит "неправильно" в SwiftUI Думаю, есть кое-что получше, чего я не знаю.
1 ответ
Если вы просто хотите добавить анимацию, вы можете попробовать:
struct ContentView: View {
...
@State var showEditView = false
var body: some View {
NavigationView {
TabView(selection: $tabSelection) {
...
view3
.tabItem {
Text("3")
}
.tag(3)
}
.navigationBarItems(leading: navigationBarLeadingItems)
}
}
}
private extension ContentView {
var view3: some View {
VStack {
if showEditView {
FormView()
.background(Color.red)
.transition(.slide)
} else {
Text("View 3")
.background(Color.blue)
.transition(.slide)
}
}
}
}
struct FormView: View {
var body: some View {
Form {
Text("test")
}
}
}
Возможной альтернативой является использование ViewRouter: какперемещаться между представлениями в SwiftUI с помощью @EnvironmentObject.