Я столкнулся с двумя проблемами со списком в 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