SwiftUI 如何让 ForEach 循环根据选择器中所选月份的天数进行迭代
SwiftUI How to Have a ForEach loop iterate based on how many days of a selected month in a Picker is
所以我创建了一行代码,它接受两个值,一年和一个月,根据你给它的值,它会计算给定年份的给定月份的天数。最初我打算使用 State 变量,因此它会自动更新,但由于 Structs 的工作方式,我无法使用我刚刚初始化的变量。 (如“无法在 属性 初始值设定项中使用实例成员 'year';属性 初始值设定项 运行 之前 'self' 可用”错误)。我想要这段代码的原因是因为我希望 forEach 循环根据该数字自动迭代(因为我正在制作的应用程序将在接下来的两年中每天都有一个列表)。这是我的代码:
struct YearView: View {
@State var year = [2020, 2021, 2022]
//monthSymbols gets an array of all the months
@State var monthArray = DateFormatter().monthSymbols!
@State var yearIndex = 0
@State var monthIndex = 0
@State var month = 0
@State var daysInMonth = Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
var body: some View {
NavigationView {
List {
Section {
VStack {
Picker("Years", selection: $yearIndex) {
ForEach(0 ..< year.count) { index in
Text(String(self.year[index])).tag(index)
}
}
.pickerStyle(SegmentedPickerStyle())
Divider()
if yearIndex == 0 {
Picker("Month", selection: $monthIndex) {
ForEach(6 ..< monthArray.count) { index in
Text(self.monthArray[index]).tag(index)
}
}
.padding(.bottom, 2)
} else {
Picker("Month", selection: $monthIndex) {
ForEach(0 ..< monthArray.count) { index in
Text(self.monthArray[index]).tag(index)
}
}
.padding(.bottom, 2)
}
}
}
Section {
ForEach(0..<10) { i in
NavigationLink(destination: ContentView(day: dayData[i])) {
DayRow(day: dayData[i])
}
}
}
}
.navigationBarTitle(Text("\(monthArray[monthIndex + indexTest]) \(String(year[yearIndex]))"))
}
.listStyle(InsetGroupedListStyle())
}
}
导航 Link 的 ForEach 循环是我想要迭代的循环。我试过这样创建一个函数:
func getRange(year: Int, month: Int) -> Int {
return Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
}
我不确定我会在哪里 运行 但是,如果那样行得通的话。我是 SwiftUI 和 GitHub 的新手,所以如果我能提供更多信息,那会有所帮助,尽管问!
据我所知,您应该能够在 ForEach 中调用 getRange(year:, month:) 函数。传入 yearIndex
和 monthIndex
.
我写了这个小示例代码来快速测试理论。让我知道这是否是您要找的。
-段
struct ContentView: View {
@State private var year = 3
@State private var month = 2
var body: some View {
List {
ForEach(0 ..< getRange(year: year, month: month)) { i in
Text("\(i)")
}
}
}
func getRange(year: Int, month: Int) -> Int {
return Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
}
}
编辑以解决您评论中的问题;
要正确更新您的选择器标签,请尝试将您的代码更改为:
Picker("Years", selection: $year) {
ForEach(0 ..< year) { index in
Text("\(index)")
}
}
看看这是否给了您想要的响应。并不是你在做什么是完全错误的,我只是不太清楚你的最终意图是什么。但是请尝试一下代码,我认为您的方向是正确的。
所以我创建了一行代码,它接受两个值,一年和一个月,根据你给它的值,它会计算给定年份的给定月份的天数。最初我打算使用 State 变量,因此它会自动更新,但由于 Structs 的工作方式,我无法使用我刚刚初始化的变量。 (如“无法在 属性 初始值设定项中使用实例成员 'year';属性 初始值设定项 运行 之前 'self' 可用”错误)。我想要这段代码的原因是因为我希望 forEach 循环根据该数字自动迭代(因为我正在制作的应用程序将在接下来的两年中每天都有一个列表)。这是我的代码:
struct YearView: View {
@State var year = [2020, 2021, 2022]
//monthSymbols gets an array of all the months
@State var monthArray = DateFormatter().monthSymbols!
@State var yearIndex = 0
@State var monthIndex = 0
@State var month = 0
@State var daysInMonth = Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
var body: some View {
NavigationView {
List {
Section {
VStack {
Picker("Years", selection: $yearIndex) {
ForEach(0 ..< year.count) { index in
Text(String(self.year[index])).tag(index)
}
}
.pickerStyle(SegmentedPickerStyle())
Divider()
if yearIndex == 0 {
Picker("Month", selection: $monthIndex) {
ForEach(6 ..< monthArray.count) { index in
Text(self.monthArray[index]).tag(index)
}
}
.padding(.bottom, 2)
} else {
Picker("Month", selection: $monthIndex) {
ForEach(0 ..< monthArray.count) { index in
Text(self.monthArray[index]).tag(index)
}
}
.padding(.bottom, 2)
}
}
}
Section {
ForEach(0..<10) { i in
NavigationLink(destination: ContentView(day: dayData[i])) {
DayRow(day: dayData[i])
}
}
}
}
.navigationBarTitle(Text("\(monthArray[monthIndex + indexTest]) \(String(year[yearIndex]))"))
}
.listStyle(InsetGroupedListStyle())
}
}
导航 Link 的 ForEach 循环是我想要迭代的循环。我试过这样创建一个函数:
func getRange(year: Int, month: Int) -> Int {
return Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
}
我不确定我会在哪里 运行 但是,如果那样行得通的话。我是 SwiftUI 和 GitHub 的新手,所以如果我能提供更多信息,那会有所帮助,尽管问!
据我所知,您应该能够在 ForEach 中调用 getRange(year:, month:) 函数。传入 yearIndex
和 monthIndex
.
我写了这个小示例代码来快速测试理论。让我知道这是否是您要找的。
-段
struct ContentView: View {
@State private var year = 3
@State private var month = 2
var body: some View {
List {
ForEach(0 ..< getRange(year: year, month: month)) { i in
Text("\(i)")
}
}
}
func getRange(year: Int, month: Int) -> Int {
return Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count
}
}
编辑以解决您评论中的问题;
要正确更新您的选择器标签,请尝试将您的代码更改为:
Picker("Years", selection: $year) {
ForEach(0 ..< year) { index in
Text("\(index)")
}
}
看看这是否给了您想要的响应。并不是你在做什么是完全错误的,我只是不太清楚你的最终意图是什么。但是请尝试一下代码,我认为您的方向是正确的。