Могу ли я получить помощь в создании таблицы с заголовками разделов, которые являются днями недели, начиная с текущего дня, например. Если сегодня суббота, то суббота является первым главой раздела, а затем последние 7 дней. Данные поступают из массива, называемого тренировками, который состоит из образцов HealthKit. Я могу найти дату, напечатав workout.startDate или workout.endDate
Вот как выглядят тренировки с 3 образцами тренировок в массиве, который я получил, выполнив запрос HealthKit. Вы можете видеть, что 2020-05-22 повторяется дважды, потому что в этот день было две тренировки.
var workouts: [HKSample]?
print (workouts) = [0 0A48A590-67BD-4121-BE59-3DA80CC88880 «Имя_приложения» (1), «iPhone12,3» (13,5) (2020-05-24 14:36:18 +1000 - 2020-05-24 14:37:12 +1000 ), 0 F744E642-C3D0-4DB4-A93A-E9AF89B6197A «Имя приложения» (1), «iPhone12,3» (13,5) (2020-05-22 17:13:31 +1000 - 2020-05-22 17:18: 16 +1000), 0 674CDF99-ED50-4EB6-B733-1786184AD92F «Имя приложения» (1), «iPhone12,3» (13,5) (2020-05-22 17:03:19 +1000 - 2020-05-22 17 : 03: 51 +1000)]
Я хотел бы разделить их на массив вроде [[], [], [], [], [], [], [] , []] с отдельными днями, чтобы я мог посчитать их для строк в разделах и подсчитать заголовки разделов. Также, если массив для этого дня пуст, я бы НЕ хотел отображать его в таблице.
var workoutsByDate: [[HKSample]]?
workoutsByDate = [[], [], [], [], [], [], [], []]
Тогда я хотел бы получить заголовок раздела для UITableview, просто получив день недели -
let workoutDayFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.timeStyle = .none
formatter.dateFormat = "EEEE"
return formatter
}()
for workout in workouts! {
let workoutDay = workoutDayFormatter.string(from: workout.startDate)
print (workoutDay)
}
Prints
Sunday
Friday
Friday
Затем составьте таблицу с дневными разделами и соответствующей тренировкой внизу. Мне потребовались недели, чтобы понять это. На данный момент таблица просто показывает все эти данные без разделов.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let numOfSections = Int(workouts?.count ?? 0)
return numOfSections
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! woroutTableViewCell
let workout = workouts[indexPath.row]
let workoutStartDate = dateFormatter.string(from: workout.startDate)
let rawStartDate = workout.startDate.timeIntervalSinceReferenceDate
let rawEndDate = workout.endDate.timeIntervalSinceReferenceDate
let workoutStartTime = dateFormatter2.string(from: workout.startDate)
let cellTitleString = "\(workoutStartDate) at \(workoutStartTime)"
cell.dateLabel?.text = "\(cellTitleString)"
let sessionDurationTotalTime = TimeInterval(rawEndDate - rawStartDate)
var sessionDurationTimeInSeconds = TimeInterval(rawEndDate - rawStartDate)
let hours = Int(sessionDurationTimeInSeconds / 3600.0)
sessionDurationTimeInSeconds -= (TimeInterval(hours) * 3600)
let minutes = Int(sessionDurationTimeInSeconds / 60.0)
sessionDurationTimeInSeconds -= (TimeInterval(minutes) * 60)
let seconds = Int(sessionDurationTimeInSeconds)
sessionDurationTimeInSeconds -= TimeInterval(seconds)
let strMinutes = String(format: "%02d", minutes)
let strSeconds = String(format: "%02d", seconds)
let sessionDurationTimeString = "\(hours)hr \(strMinutes)min \(strSeconds)sec"
let cellTimeString = "\(sessionDurationTimeString)"
cell.durationLabel?.text = "\(cellTimeString)"
return cell
}