ios - 基于 SWIFTUI 中的按钮操作和选定索引的滚动视图
问题描述
我想在 SwiftUI 中使用 Button 操作制作滚动视图
为此,我使用 ScrollViewReader 编写了以下代码,但它给了我一个错误。
使用未解析的标识符“ScrollViewReader”给出错误
找到我的代码如下。
任何人都对这个问题有一些想法。
预期输出如下图
struct ContentView: View {
@State var days = [CalendarDay]()
@State var selectedDay: Int = 0
var body: some View {
ScrollViewReader { scrollProxy in
HStack {
Button(action: {
if selectedDay > 0 {
for j in days.indices { days[j].isToday = false }
days[selectedDay-1].isToday = true
selectedDay -= 1
withAnimation { scrollProxy.scrollTo(selectedDay) }
}
}) {
Image(systemName: "chevron.left.circle.fill")
}
ZStack{
VStack {
ScrollView(.horizontal, showsIndicators: false){
HStack(spacing: 20) {
ForEach(days.indices, id: \.self) { i in
CalendarView(
number: days[i].number,
days: days[i].weekday,
color: days[i].isToday ? #colorLiteral(red: 0.9060331583, green: 0.2547450066, blue: 0.3359550834, alpha: 1) : #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1),
textcolor: days[i].isToday ? #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) : #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
).onTapGesture {
selectedDay = i
for j in days.indices {
if j == i {
days[i].isToday = true
} else {
days[j].isToday = false
}
}
}
}
}
.padding(.leading,10)
.padding(.bottom, 10)
.shadow(radius: 3, x: 3, y: 3)
}
}
}
Button(action: {
if selectedDay < days.count-1 {
for j in days.indices { days[j].isToday = false }
days[selectedDay+1].isToday = true
selectedDay += 1
withAnimation { scrollProxy.scrollTo(selectedDay) }
}
}) {
Image(systemName: "chevron.right.circle.fill")
}
}
}
.onAppear {
getCurrentWeekdays()
}
}
func getCurrentWeekdays() {
/// from https://stackoverflow.com/a/62355272/14351818
let dateComponents = Calendar(identifier: .gregorian).dateComponents([.yearForWeekOfYear, .weekOfYear], from: Date())
let startOfWeek = Calendar(identifier: .gregorian).date(from: dateComponents)!
let startOfWeekNoon = Calendar(identifier: .gregorian).date(bySettingHour: 12, minute: 0, second: 0, of: startOfWeek)!
days = (0...6).map {
let calendar = Calendar(identifier: .gregorian)
let date = calendar.date(byAdding: .day, value: $0, to: startOfWeekNoon)!
let numberDateFormatter = DateFormatter()
numberDateFormatter.dateFormat = "d"
let number = numberDateFormatter.string(from: date)
let weekdayDateFormatter = DateFormatter()
weekdayDateFormatter.dateFormat = "E"
let weekday = weekdayDateFormatter.string(from: date)
let calendarDay = CalendarDay(
number: number,
weekday: weekday,
isToday: calendar.component(.day, from: Date()) == calendar.component(.day, from: date)
)
// <--- here --->
if calendar.component(.day, from: Date()) == calendar.component(.day, from: date) {
selectedDay = $0
}
return calendarDay
}
}
}
解决方案
推荐阅读
- python - 转换多个字符串行并将每行读取为整数
- php - 如何以所需的顺序从查询中获取参数?
- plsql - 如何自动替换语句中的多个值?
- sql-server - MSSQL 数据库中 Round 函数的奇怪行为仅适用于 Real 列
- pivot-table - Acumatica - 如何在全新屏幕中创建数据透视表
- php - MySQL查询使用日期范围获取数据
- javascript - 空的缩小的 React 应用程序,为什么它已经很大了?
- java - 使用 JSONB(apache johnzon)注释多态实现时出现 ClassCastException
- c# - SurfaceListBoxItem 触发器 IsSelected
- html - 如何在 react-native 中通过 webview 提交 html 表单