Список SwiftUI автоматически прокручивается вверх при загрузке данныхPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Список SwiftUI автоматически прокручивается вверх при загрузке данных

Сообщение Anonymous »

Я столкнулся с двумя проблемами со списком в SwiftUI, и я прикрепил GIF-файл и изображение для справки:
Автоматическая прокрутка вверх при обновлении данных:
Всякий раз, когда я обновляю свои данные (например, перезагружаю или изменяю список), список автоматически прокручивается вверх. Я бы предпочел, чтобы он оставался в текущей позиции прокрутки. Как я могу предотвратить такое поведение и сохранить стабильное положение прокрутки?
Действия смахивания влияют на все элементы:
Я реализовал действия смахивания с помощью .swipeActions в своем списке. Однако, когда я смахиваю любой элемент, кажется, что действия смахивания применяются ко всем строкам в списке, а не только к той, с которой я взаимодействовал. Как я могу ограничить действия смахивания только определенным прокручиваемым элементом?
Дополнительная информация:
Я использую список, заключенный в NavigationView.
Данные обновляются динамически по мере их получения с удаленного устройства. API.
Для действий смахивания я использую модификатор .swipeActions.
[img]https://i.sstatic.net /MBPtPatp.gif[/img]


private var historySection: some View {
VStack(spacing: 0) {
if viewModel.isLoading || viewModel.isLoadingMore {
ForEach(0.. String {
guard let account = accountDictionary[accountId] else { return "Не указан" }
return account.name
}

private var formattedAmount: String {
let amount = item.amount
return NumberFormatterHelper.formatNumberWithSign(item.type == "expense" ? -amount : amount, currency: viewModel.selectedCurrency)
}
}

func loadMoreHistoryData(reset: Bool = false, reportMonth: String, reportCategoryId: Int = 0) async {
if isLoadingMore { return }

isLoadingMore = true
defer { isLoadingMore = false }

if reset {
currentPage = 1
historyItems = []
isAllDataLoaded = false
}

do {
let (newItems, totalIncome, totalExpenses) = try await dataService.getRecentTransactions(page: currentPage, size: pageSize, reportMonth: reportMonth, reportCategoryId: reportCategoryId)

// Сохраняем статистику
self.totalIncome = totalIncome
self.totalExpenses = totalExpenses

DispatchQueue.main.async {
self.historyItems.append(contentsOf: newItems)
self.currentPage += 1
if newItems.count < self.pageSize {
self.isAllDataLoaded = true
}
}
} catch {
DispatchQueue.main.async {
self.errorMessage = error.localizedDescription
}
}
}

func loadMoreHistoryForCategory(reportMonth: String, selectedCategoryId: Int) async {
guard !isLoadingMore, !isAllDataLoaded else { return }

isLoadingMore = true
defer { isLoadingMore = false }

do {
let (newItems, totalIncome, totalExpenses) = try await dataService.getHistoryForCategory(page: currentPage, size: pageSize, reportMonth: reportMonth, reportCategoryId: selectedCategoryId)

// Сохраняем статистику
self.totalIncome = totalIncome
self.totalExpenses = totalExpenses

if newItems.count < pageSize {
isAllDataLoaded = true
}

if !newItems.isEmpty {
historyItems.append(contentsOf: newItems)
currentPage += 1
}
} catch {
print("Ошибка подгрузки истории для категории \(selectedCategoryId) за месяц \(reportMonth): \(error.localizedDescription)")
}
}


private var historySection: some View {
VStack(spacing: 0) {
if viewModel.isLoading || viewModel.isLoadingMore {
ForEach(0.. String {
guard let account = accountDictionary[accountId] else { return "Не указан" }
return account.name
}

private var formattedAmount: String {
let amount = item.amount
return NumberFormatterHelper.formatNumberWithSign(item.type == "expense" ? -amount : amount, currency: viewModel.selectedCurrency)
}
}

func loadMoreHistoryData(reset: Bool = false, reportMonth: String, reportCategoryId: Int = 0) async {
if isLoadingMore { return }

isLoadingMore = true
defer { isLoadingMore = false }

if reset {
currentPage = 1
historyItems = []
isAllDataLoaded = false
}

do {
let (newItems, totalIncome, totalExpenses) = try await dataService.getRecentTransactions(page: currentPage, size: pageSize, reportMonth: reportMonth, reportCategoryId: reportCategoryId)

// Сохраняем статистику
self.totalIncome = totalIncome
self.totalExpenses = totalExpenses

DispatchQueue.main.async {
self.historyItems.append(contentsOf: newItems)
self.currentPage += 1
if newItems.count < self.pageSize {
self.isAllDataLoaded = true
}
}
} catch {
DispatchQueue.main.async {
self.errorMessage = error.localizedDescription
}
}
}

func loadMoreHistoryForCategory(reportMonth: String, selectedCategoryId: Int) async {
guard !isLoadingMore, !isAllDataLoaded else { return }

isLoadingMore = true
defer { isLoadingMore = false }

do {
let (newItems, totalIncome, totalExpenses) = try await dataService.getHistoryForCategory(page: currentPage, size: pageSize, reportMonth: reportMonth, reportCategoryId: selectedCategoryId)

// Сохраняем статистику
self.totalIncome = totalIncome
self.totalExpenses = totalExpenses

if newItems.count < pageSize {
isAllDataLoaded = true
}

if !newItems.isEmpty {
historyItems.append(contentsOf: newItems)
currentPage += 1
}
} catch {
print("Ошибка подгрузки истории для категории \(selectedCategoryId) за месяц \(reportMonth): \(error.localizedDescription)")
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... ta-loading
Ответить

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

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

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

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

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