Я столкнулся с двумя проблемами со списком в 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
Список SwiftUI автоматически прокручивается вверх при загрузке данных ⇐ Php
Кемеровские программисты php общаются здесь
1729641714
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)")
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79116056/swiftui-list-auto-scrolls-to-top-on-data-loading[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия