Как вывести stepCount в текстовую строку (UILabel) - PullRequest
0 голосов
/ 09 октября 2018

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

Начнем с того, что я дошел до того, что могу позвонить на HealthCit StepCount, чтобы показать мне шаги,день.Это успешно, пока я использую кнопку (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)"
            }
        }
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

Вам просто нужно вызвать тот же код внутри 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()
    }
}
...