Массив SWIFT образцов HealthKt, разделенный на группы массивов по дате, затем отображается в UITableView - PullRequest
0 голосов
/ 26 мая 2020

Могу ли я получить помощь в создании таблицы с заголовками разделов, которые являются днями недели, начиная с текущего дня, например. Если сегодня суббота, то суббота является первым главой раздела, а затем последние 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
}

1 Ответ

0 голосов
/ 29 июня 2020

Прошло несколько недель, и я нашел решение. Я отправлю его здесь для использования в будущем или если он поможет кому-то другому. Не стесняйтесь дать свой собственный ответ или улучшить мой.

Я создал разделы для дня недели в HKSample.startDate

введите описание изображения здесь

struct Objects {
    var sectionName : String!
    var sectionObjects : [HKSample]!
}
var objectArray = [Objects]()

...

self.objectArray = [Objects]()
var userObjects = [HKSample] ()
var prevHeader = ""
let formatter = DateFormatter()
for i in 0...samples!.count-1 {
    let sample = samples![i].startDate
    formatter.setLocalizedDateFormatFromTemplate("eeee")
    let dayOfWeek = formatter.string(from: sample)
    
     if prevHeader == "" {
         userObjects.append(samples![i])
     }
     else if prevHeader == dayOfWeek {
         userObjects.append(samples![i])
     }
     else {
         self.objectArray.append(Objects(sectionName: prevHeader, sectionObjects: userObjects))
         userObjects = [HKSample] ()
         userObjects.append(samples![i])
     }
     prevHeader = dayOfWeek
 }
    self.objectArray.append(Objects(sectionName: prevHeader, sectionObjects: userObjects))
    self.tableView.reloadData()

...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! sampleTableViewCell
    let sample =  objectArray[indexPath.section].sectionObjects[indexPath.row]
    cell.dateLabel?.text = ... decorate cell ...
}

func numberOfSections(in tableView: UITableView) -> Int {
        return objectArray.count
    }

func tableView(_ tableView: UITableView,
                        titleForHeaderInSection section: Int) -> String? {
    return objectArray[section].sectionName.uppercased()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return objectArray[section].sectionObjects.count
}
...