Код: Выделить всё
import SwiftUI
struct ContentView: View {
@State private var selectedTab = 0
@State private var visibleTabs: [TabItem] = []
@State private var previousTab = 0
var body: some View {
NavigationView {
VStack {
TabView(selection: $selectedTab) {
ForEach(visibleTabs) { tab in
tab.view
.tabItem {
Label(tab.title, systemImage: tab.icon)
}
.tag(tab.id)
}
}
.onChange(of: selectedTab) { oldValue, newValue in
if oldValue != newValue {
previousTab = newValue
}
}
}
.onAppear {
updateVisibleTabs()
// Ensure selectedTab is valid
if !visibleTabs.contains(where: { $0.id == selectedTab }) {
selectedTab = visibleTabs.first?.id ?? 0
}
}
}
}
private func updateVisibleTabs() {
visibleTabs = allTabs
}
private var allTabs: [TabItem] {
[
TabItem(id: 0, title: "Tab One", icon: "1.circle", view: AnyView(TabOneView())),
TabItem(id: 1, title: "Tab Two", icon: "2.circle", view: AnyView(TabTwoView())),
TabItem(id: 2, title: "Tab Three", icon: "3.circle", view: AnyView(TabThreeView())),
TabItem(id: 3, title: "Tab Four", icon: "4.circle", view: AnyView(TabFourView())),
TabItem(id: 4, title: "Tab Five", icon: "5.circle", view: AnyView(TabFiveView())),
TabItem(id: 5, title: "Tab Six", icon: "6.circle", view: AnyView(TabSixView())),
TabItem(id: 6, title: "Tab Seven", icon: "7.circle", view: AnyView(TabSevenView()))
]
}
}
struct TabItem: Identifiable {
let id: Int
let title: String
let icon: String
let view: AnyView
}
struct TabOneView: View {
@State private var data: String = ""
var body: some View {
VStack {
Text("Tab One")
.font(.largeTitle)
Text("Data: \(data)")
.padding()
}
.onAppear {
fetchData()
}
}
private func fetchData() {
// Simulated API request
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data,
let todo = try? JSONDecoder().decode(Todo.self, from: data) {
DispatchQueue.main.async {
self.data = todo.title
}
}
}.resume()
}
}
struct Todo: Decodable {
let id: Int
let title: String
let completed: Bool
}
// Dummy views for other tabs
struct TabTwoView: View { var body: some View { Text("Tab Two") } }
struct TabThreeView: View { var body: some View { Text("Tab Three") } }
struct TabFourView: View { var body: some View { Text("Tab Four") } }
struct TabFiveView: View { var body: some View { Text("Tab Five") } }
struct TabSixView: View { var body: some View { Text("Tab Six") } }
struct TabSevenView: View { var body: some View { Text("Tab Seven") } }
#Preview {
ContentView()
}
Первая вкладка (TabOneView) отправляет запрос API к API-заполнителю (jsonplaceholder.typicode.com) ), что является распространенной конечной точкой тестирования.
Проблема возникает при выборе первого элемента в меню «Дополнительно»; он не переходит к правильному представлению, хотя запрос API в TabOneView выполнен успешно.
Кто-нибудь сталкивался с подобной проблемой с TabView и меню «Дополнительно» в SwiftUI?Существует ли обходной путь или решение, гарантирующее, что выбор первого элемента в меню «Дополнительно» приведет к правильному представлению?
Может ли проблема быть связана с тем, как TabView обрабатывает выбор и отображает обновления при переполнении вкладок в тот Раздел «Дополнительно»?
Будем очень признательны за любые идеи и предложения.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ates-wrong
Мобильная версия