Как вывести stepCount в текстовую строку (UILabel)

Извиняюсь за форматирование, непонимание, терминологию и т. д. Я учусь всего два дня, так что еще мало что понимаю. Я графический дизайнер по профессии, и я пытаюсь сделать приложение для личного использования, которое требует некоторых данных и делает его визуально более привлекательным для меня. Я хочу создать счетчик шагов за день и получить эту информацию из приложения для здоровья.

Начнем с того, что я дошел до точки, когда я могу вызвать счетчик шагов HealthKit, чтобы показать мне шаги, сделанные в тот день. Это успешно, пока я использую кнопку (IBAction) для получения данных stepCount, а затем вывожу в текстовую строку (UILabel). (Например, числа выводятся с десятичной точкой 66,0, но шаг за шагом, ха!)

На данный момент я хотел бы просто автоматически заполнить «totalSteps UILabel», чтобы показать stepCount, вместо того, чтобы действовать нажатием кнопки.

Я пробовал так много разных способов, что потерял представление о том, что я пробовал и куда я поместил код, поэтому любая помощь и / или краткое объяснение были бы замечательными!

Благодарю вас

import UIKit
import HealthKit

class ViewController: UIViewController {

    @IBOutlet weak var totalSteps: UILabel!
    @IBOutlet weak var quotePhrase: UITextView!

    let healthStore = HKHealthStore()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


        func authoriseHealthKitAccess(_ sender: Any) {
            let healthKitTypes: Set = [
                // access step count
                HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
            ]
            healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (_, _) in
                print("authrised???")
            }
            healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (bool, error) in
                if let e = error {
                    print("oops something went wrong during authorisation \(e.localizedDescription)")
                } else {
                    print("User has completed the authorization flow")
                }
            }
        }  
    }

    func getTodaysSteps(completion: @escaping (Double) -> Void) {

        let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

        let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
            var resultCount = 0.0
            guard let result = result else {
                print("Failed to fetch steps rate")
                completion(resultCount)
                return
            }
            if let sum = result.sumQuantity() {
                resultCount = sum.doubleValue(for: HKUnit.count())
            }

            DispatchQueue.main.async {
                completion(resultCount)
            }
        }
        healthStore.execute(query)
    }

    //Button Action Here:

    @IBAction func getTotalSteps(_ sender: Any) {
        getTodaysSteps { (result) in
            print("\(result)")
            DispatchQueue.main.async {
                self.totalSteps.text = "\(result)"
            }
        }
    }
}

person ccoll163099    schedule 08.10.2018    source источник


Ответы (1)


Вам просто нужно вызвать тот же код внутри файла viewDidLoad. Вы также должны вызывать этот код, когда пользователь предоставляет разрешение на доступ к данным о работоспособности. Я рассмотрел оба сценария в приведенном ниже коде.

import UIKit
import HealthKit

class ViewController: UIViewController {

    @IBOutlet weak var totalSteps: UILabel!
    @IBOutlet weak var quotePhrase: UITextView!

    let healthStore = HKHealthStore()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.authoriseHealthKitAccess()
    }

    func authoriseHealthKitAccess() {
            let healthKitTypes: Set = [
                // access step count
                HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
            ]
            healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { [weak self] (bool, error) in
                if let e = error {
                    print("oops something went wrong during authorisation \(e.localizedDescription)")
                } else {
                    print("User has completed the authorization flow")
                    self?.updateStepsCountLabel()
                }
           }
     }

    func getTodaysSteps(completion: @escaping (Double) -> Void) {

        let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

        let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
            var resultCount = 0.0
            guard let result = result else {
                print("Failed to fetch steps rate")
                completion(resultCount)
                return
            }
            if let sum = result.sumQuantity() {
                resultCount = sum.doubleValue(for: HKUnit.count())
            }

            DispatchQueue.main.async {
                completion(resultCount)
            }
        }
        healthStore.execute(query)
    }

    private func updateStepsCountLabel() {
        getTodaysSteps { (result) in
            print("\(result)")
            DispatchQueue.main.async {
                self.totalSteps.text = "\(result)"
            }
        }
    }

    //Button Action Here:

    @IBAction func getTotalSteps(_ sender: Any) {
        updateStepsCountLabel()
    }
}
person Kamran    schedule 09.10.2018
comment
Спасибо!! Это сработало. Единственное изменение, которое мне пришлось внести, было в self.authoriseHealthKitAccess(), который хотел это ((Any).self). Я пока не уверен, почему, но я потрачу немного времени на сравнение моего исходного кода с вашим обновленным и выясню, что именно отличается и почему. Тяжело... Надеюсь, скоро все прояснится. - person ccoll163099; 09.10.2018
comment
Я пропустил удаление аргумента _ sender: Any из метода authoriseHealthKitAccess. Я только что обновил ответ. Ваше исправление также было в порядке, но его удаление выглядит более разумным. - person Kamran; 09.10.2018
comment
Отлично, спасибо. Теперь мне кажется, что все это имеет смысл. В конце концов мне также удалось избавиться от десятичной дроби и нуля, добавив некоторое дополнение в конец [private func]. Потребовалось два дня, чтобы понять плавающие нули по сравнению с форматированием и расширениями чисел. В конце концов, это было прямо вперед. Спасибо за помощь. - person ccoll163099; 10.10.2018