Swift实现日期数组前后翻页取7条日期的for循环条件问题
连续翻页日期序列实现方案
场景与需求
- 初始加载的日期数组:
["24-05-2022", "25-05-2022", "26-05-2022", "27-05-2022", "28-05-2022", "29-05-2022", "30-05-2022"] - 页面提供两个操作按钮:Next(下一页)、Previous(上一页)
- 交互规则:
- 点击下一页:返回当前显示序列之后的7个连续日期,首次点击需返回
["31-05-2022", "01-06-2022", "02-06-2022", "03-06-2022", "04-06-2022", "05-06-2022", "06-06-2022"],第二次点击返回07-06-2022至13-06-2022的7个日期,向后翻页最多支持10次 - 点击上一页:返回当前显示序列之前的7个连续日期
- 点击下一页:返回当前显示序列之后的7个连续日期,首次点击需返回
现有代码问题
你当前实现的getNextDates()方法固定以self.presentDate为基准,每次仅计算该基准之后1-7天的日期,没有记录当前的翻页偏移状态,自然无法支持连续翻页、翻页次数限制的逻辑。原有代码如下:
func getNextDates() { let formatter = DateFormatter() formatter.dateFormat = "dd-MM-YYYY" let selectedDate = self.presentDate let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd-MM-yyyy" dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00") guard let selected = dateFormatter.date(from: selectedDate) else { fatalError() } let dateString = formatter.string(from: selected) print("Selected Date is ==>",dateString) let calendar = Calendar(identifier: .gregorian) for i in 1...7 { let newDate = calendar.date(byAdding: .day, value: i, to: selected) let formatter = DateFormatter() formatter.dateFormat = "dd-MM-YYYY" let dateString = formatter.string(from: newDate!) print("Next DAYS ARE ==>>",dateString) } }
另外代码里日期格式化混用了YYYY和yyyy,YYYY对应的是ISO周日历的年份,普通公历日期要统一用yyyy,否则跨年周会出现日期解析错误。
实现逻辑
不需要固定for循环的范围为1...7,只需要额外维护两个状态值即可实现需求:
- 记录当前相对于初始第一页的页码偏移量
currentPageOffset,初始值为0 - 定义最大向后翻页次数
maxNextPageCount = 10,每页固定展示7条日期 - 计算当前页日期时,for循环的天数偏移范围为:从
currentPageOffset * 7 + 1开始,连续取7个日期即可 - 点击下一页时先判断当前偏移量是否小于最大翻页次数,符合条件则偏移量+1,再计算当前页日期
- 点击上一页时先判断当前偏移量是否大于0,符合条件则偏移量-1,再计算当前页日期
可直接复用的核心代码
// 视图模型/控制器内定义的状态与工具属性 var currentPageOffset = 0 let maxNextPageCount = 10 let pageSize = 7 let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" formatter.timeZone = TimeZone(abbreviation: "GMT+0:00") formatter.calendar = Calendar(identifier: .gregorian) return formatter }() // 锚点日期为初始第一页的最后一个日期,对应初始数组的"30-05-2022",提前解析为Date类型存储 var baseAnchorDate: Date! // 通用方法:获取当前页的日期数组 func getCurrentPageDates() -> [String] { var dateList: [String] = [] let startDayOffset = currentPageOffset * pageSize + 1 for dayDelta in startDayOffset..<startDayOffset + pageSize { guard let targetDate = Calendar(identifier: .gregorian).date(byAdding: .day, value: dayDelta, to: baseAnchorDate) else { continue } dateList.append(dateFormatter.string(from: targetDate)) } return dateList } // 下一页按钮点击触发方法 func onNextPageTap() -> [String]? { guard currentPageOffset < maxNextPageCount else { // 达到最大翻页限制,不执行翻页 return nil } currentPageOffset += 1 return getCurrentPageDates() } // 上一页按钮点击触发方法 func onPrevPageTap() -> [String]? { guard currentPageOffset > 0 else { // 已经在第一页,不执行翻页 return nil } currentPageOffset -= 1 return getCurrentPageDates() }
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

