Почему моя страница прокручивается вверх, когда я нажимаю кнопку?IOS

Программируем под IOS
Ответить
Anonymous
 Почему моя страница прокручивается вверх, когда я нажимаю кнопку?

Сообщение Anonymous »

У меня довольно простой вид.
Это маршрут поездки, состоящий из двух частей:
  • Горизонтально прокручиваемый список дат вверху страницы.
  • Вертикально прокручиваемый список дней (каждый день содержит множество остановок).
Я добавил логика для .scrollPosition(), чтобы, когда пользователь прокручивает вертикальный список, горизонтальный список мог обновлять, в какой день пользователь в данный момент активен на странице.
Аналогично, когда пользователь нажимает на день в горизонтальном списке вверху страницы, я настроил его на автоматическую прокрутку вниз до этого дня в вертикальном списке.
Вот этот код:

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

struct TripView: View {
@Environment(\.dismiss) private var dismiss

@Binding var trip: Trip

@State private var activeDate: String?

var body: some View {
VStack(spacing: 0) {
// HORIZONTAL DATE PICKER
ScrollViewReader { proxy in
ScrollView(.horizontal, showsIndicators: false) {
LazyHStack(spacing: 16) {
ForEach(trip.days, id: \.id) { day in
Button(action: {
withAnimation(.spring(duration: 0.3)) {
activeDate = day.date
}
}, label: {
VStack(spacing: 2) {
Text(day.date.formatDate(fromFormat: "yyyy-MM-dd", toFormat: "d") ?? "")
.background(activeDate == day.date ? Color.blue : Color.clear)
}
})
.id(day.date)
}
}
}
.onChange(of: activeDate) { oldValue, newValue in
print("Active date changed to: \(newValue)")

if let newValue {
withAnimation {
proxy.scrollTo(newValue, anchor: .center)
}
}
}
}

// VERTICAL CONTENT LIST
ScrollView {
LazyVStack(spacing: 0) {
ForEach($trip.days) { $day in
TripDayView(
tripId: trip.id,
day: $day
)
.id(day.date)
}
}
.scrollTargetLayout()
}
.scrollPosition(id: $activeDate, anchor: .top)
}
}
}
Проблема, с которой я столкнулся, находится внутри TripDayView ниже.

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

struct TripDayView: View {
@EnvironmentObject var tripManager: TripManager

let tripId: Int
@Binding var day: Day

@State private var showingActionSheet: Bool = false

var body: some View {
Section {
headerView

ListStopsView(tripId: tripId, stops: $day.stops)
}
}

var headerView: some View {
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: 0) {
VStack(alignment: .leading, spacing: 0) {
Text(day.date.formatDate(fromFormat: "yyyy-MM-dd", toFormat: "EE, MMM d") ?? "")
}

Spacer()

Button(action: {
showingActionSheet = true
}, label: {
Image("Ellipsis Vertical")
})
.confirmationDialog("", isPresented: $showingActionSheet, titleVisibility:  .hidden) {
Button("Option 1") {
//
}

Button("Option 2") {
//
}

Button("Option 3") {
//
}
}
}
}
}
}
Когда я нажимаю кнопку (которая устанавливает showActionSheet = true), вертикальный список в TripView прокручивается вверх, когда отображается диалоговое окно подтверждения.
Что является причиной этого? Как это исправить?
Похоже, это связано с .scrollPosition(), потому что, когда я закомментирую эту строку, она не прокручивается вверх, когда я нажимаю кнопку. Но мне нужно сохранить эту функциональность.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-a-button
Ответить

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

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

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

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

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