SwiftUI TabView иногда перемещается неправильноIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI TabView иногда перемещается неправильно

Сообщение Anonymous »

Я работаю над приложением SwiftUI, которое использует TabView с несколькими вкладками. Если вкладок слишком много для отображения, появляется опция «Дополнительно», позволяющая справиться с переполнением. Я столкнулся с проблемой, из-за которой выбор первого элемента в меню «Дополнительно» не приводит к правильному представлению — вместо этого открывается первая вкладка на главной панели вкладок. Интересно, что эта первая вкладка в меню «Дополнительно» содержит запрос API, который выполняется успешно, указывая на то, что представление загружается, но пользовательский интерфейс все равно переходит на неправильную вкладку.

Код: Выделить всё

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()
}
TabView использует Int для selectedTab и уникальные целочисленные идентификаторы для каждого TabItem.
Первая вкладка (TabOneView) отправляет запрос API к API-заполнителю (jsonplaceholder.typicode.com) ), что является распространенной конечной точкой тестирования.
Проблема возникает при выборе первого элемента в меню «Дополнительно»; он не переходит к правильному представлению, хотя запрос API в TabOneView выполнен успешно.
Кто-нибудь сталкивался с подобной проблемой с TabView и меню «Дополнительно» в SwiftUI?Существует ли обходной путь или решение, гарантирующее, что выбор первого элемента в меню «Дополнительно» приведет к правильному представлению?
Может ли проблема быть связана с тем, как TabView обрабатывает выбор и отображает обновления при переполнении вкладок в тот Раздел «Дополнительно»?
Будем очень признательны за любые идеи и предложения.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ates-wrong
Ответить

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

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

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

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

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