You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:49:50