Swift UITableView实现工作日营业时间展示功能方案咨询
嘿,我来帮你搞定这个营业时间展示的需求!结合你已经搭建好的CoreData存储和两个控制器,我整理了一套落地的实现方案,一步步来:
1. 先确认CoreData的
HourInfo实体结构 首先得确保你的HourInfo实体有对应所需的属性,建议设置为:
weekday:Int16类型,用来标记星期几(注意:iOS系统默认日历里1代表周日,2代表周一,这里要和你后续的逻辑统一)startTime:Date类型,存储当天的开始营业时间endTime:Date类型,存储当天的结束营业时间
2. 在
OpeningHoursInfoController中获取并整理数据 需要从CoreData拉取所有营业时间数据,并按星期排序,方便列表展示:
// 定义数组存储营业时间数据 var openingHours: [HourInfo] = [] override func viewDidLoad() { super.viewDidLoad() fetchOpeningHours() tableView.reloadData() } // 从CoreData获取数据的方法 private func fetchOpeningHours() { let context = persistentContainer.viewContext let request: NSFetchRequest<HourInfo> = HourInfo.fetchRequest() // 按星期排序,保证列表顺序正确 let sortDescriptor = NSSortDescriptor(key: "weekday", ascending: true) request.sortDescriptors = [sortDescriptor] do { openingHours = try context.fetch(request) } catch { print("拉取营业时间失败: \(error)") } }
3. 实现UITableView的格式化展示
核心是把CoreData里的原始数据转换成Monday: 9:00 AM - 5:00 PM这种格式,我们可以写两个工具方法来处理星期和时间的格式化:
// 把星期数字转成英文名称(注意和你的weekday数字规则匹配) private func formattedWeekday(from weekday: Int16) -> String { // 这里假设weekday=1对应周一,如果是系统默认的1=周日,就把数组第一个改成"Sunday" let weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] return weekdays[Int(weekday - 1)] } // 把Date转成12小时制带AM/PM的格式 private func formattedTime(from date: Date) -> String { let formatter = DateFormatter() formatter.dateFormat = "h:mm a" formatter.locale = Locale(identifier: "en_US_POSIX") // 确保AM/PM是英文格式 return formatter.string(from: date) }
然后在UITableView的数据源方法里组装最终的展示文本:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return openingHours.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "HourCell", for: indexPath) let hourInfo = openingHours[indexPath.row] // 组装成目标格式的字符串 let displayText = "\(formattedWeekday(from: hourInfo.weekday)): \(formattedTime(from: hourInfo.startTime!)) - \(formattedTime(from: hourInfo.endTime!))" cell.textLabel?.text = displayText return cell }
4. 配套
AddDayHourController的保存逻辑 确保用户添加的营业时间能正确存入CoreData,示例代码如下:
// 假设你已经通过选择器让用户选好了星期、开始时间、结束时间 private func saveNewHourInfo() { let context = persistentContainer.viewContext let newHourInfo = HourInfo(context: context) newHourInfo.weekday = selectedWeekday // 用户选择的星期数字 newHourInfo.startTime = selectedStartTime // 用户选择的开始时间 newHourInfo.endTime = selectedEndTime // 用户选择的结束时间 do { try context.save() // 保存成功后返回列表页 navigationController?.popViewController(animated: true) } catch { print("保存营业时间失败: \(error)") } }
5. 额外优化建议
- 处理重复星期:如果用户重复添加同一个星期的营业时间,可以在保存前先查询是否已有该星期的数据,提示用户覆盖或更新,避免列表出现重复项
- 处理未设置的星期:如果某个星期没有设置营业时间,可以在列表里显示
Monday: Closed,这时候可以先创建包含所有星期的数组,再和CoreData的数据匹配,缺失的就显示Closed - 时间有效性验证:在
AddDayHourController里添加逻辑,确保结束时间晚于开始时间,避免存入无效数据
内容的提问来源于stack exchange,提问作者Georgy
相关产品推荐
相关产品推荐

