首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能从CareKit中子类“CareKit”呢?

为什么我不能从CareKit中子类“CareKit”呢?
EN

Stack Overflow用户
提问于 2021-08-10 13:10:30
回答 1查看 218关注 0票数 0

注意:两天前我试着在苹果开发者论坛上发帖,但没有收到任何回复,也没有收到任何回复。

我一直被困在我的项目的这一部分,因为我想要反映苹果的方式,他们关心的视图设置,以显示任务给用户。由于某些原因,我不能将'OCKSurveyTaskViewController‘子类,因为我得到的错误是:

“无法在作用域中找到'OCKSurveyTaskViewController‘类型”

我已经通过SPM重新安装了2或3次CareKit,甚至当我看到确切的OCKSurveyTaskViewController.swift文件并在代码中将它从Xcode的CareKit/iOS/Task/ViewController目录中作为一个打开类列出时,我也不明白为什么不能对它进行子类分类。

谁能给我一些指导,或者以另一种方式显示我每天为用户建立的ORKTasks?我更喜欢苹果在他们的wwdc21 CareKit代码中使用的方法,但是遗憾的是,我在这个问题上已经坚持了太久,这是我下一步所需要的。

这是我的文件代码:

代码语言:javascript
复制
import UIKit
import CareKit
import CareKitUI
import CareKitStore
import ResearchKit
import os.log

class StudyTaskFeedViewController: OCKDailyTasksPageViewController, OCKSurveyTaskViewController {}

下面是OCKSurveyTaskViewController.swift文件的代码:

代码语言:javascript
复制
#if !os(watchOS) && canImport(ResearchKit)

import CareKitStore
import CareKitUI
import ResearchKit
import UIKit

// MARK: OCKSurveyTaskViewControllerDelegate

public protocol OCKSurveyTaskViewControllerDelegate: AnyObject {

    func surveyTask(
        viewController: OCKSurveyTaskViewController,
        for task: OCKAnyTask,
        didFinish result: Result<ORKTaskViewControllerFinishReason, Error>)

    func surveyTask(
        viewController: OCKSurveyTaskViewController,
        shouldAllowDeletingOutcomeForEvent event: OCKAnyEvent) -> Bool
}

public extension OCKSurveyTaskViewControllerDelegate {

    func surveyTask(
        viewController: OCKSurveyTaskViewController,
        for task: OCKAnyTask,
        didFinish result: Result<ORKTaskViewControllerFinishReason, Error>) {
        // No-op
    }

    func surveyTask(
        viewController: OCKSurveyTaskViewController,
        shouldAllowDeletingOutcomeForEvent event: OCKAnyEvent) -> Bool {
        return true
    }
}

open class OCKSurveyTaskViewController: OCKTaskViewController<OCKTaskController, OCKSurveyTaskViewSynchronizer>, ORKTaskViewControllerDelegate {

    private let extractOutcome: (ORKTaskResult) -> [OCKOutcomeValue]?

    public let survey: ORKTask

    public weak var surveyDelegate: OCKSurveyTaskViewControllerDelegate?

    public convenience init(
        task: OCKAnyTask,
        eventQuery: OCKEventQuery,
        storeManager: OCKSynchronizedStoreManager,
        survey: ORKTask,
        viewSynchronizer: OCKSurveyTaskViewSynchronizer = OCKSurveyTaskViewSynchronizer(),
        extractOutcome: @escaping (ORKTaskResult) -> [OCKOutcomeValue]?) {

        self.init(
            taskID: task.id,
            eventQuery: eventQuery,
            storeManager: storeManager,
            survey: survey,
            viewSynchronizer: viewSynchronizer,
            extractOutcome: extractOutcome
        )
    }

    public init(
        taskID: String,
        eventQuery: OCKEventQuery,
        storeManager: OCKSynchronizedStoreManager,
        survey: ORKTask,
        viewSynchronizer: OCKSurveyTaskViewSynchronizer = OCKSurveyTaskViewSynchronizer(),
        extractOutcome: @escaping (ORKTaskResult) -> [OCKOutcomeValue]?) {

        self.survey = survey
        self.extractOutcome = extractOutcome

        super.init(
            viewSynchronizer: viewSynchronizer,
            taskID: taskID,
            eventQuery: eventQuery,
            storeManager: storeManager
        )
    }

    override open func taskView(
        _ taskView: UIView & OCKTaskDisplayable,
        didCompleteEvent isComplete: Bool,
        at indexPath: IndexPath,
        sender: Any?) {

        guard isComplete else {

            if let event = controller.eventFor(indexPath: indexPath),

               let delegate = surveyDelegate,

               delegate.surveyTask(
                    viewController: self,
                    shouldAllowDeletingOutcomeForEvent: event) == false {

                return
            }

            let cancelAction = UIAlertAction(
                title: "Cancel",
                style: .cancel,
                handler: nil
            )

            let confirmAction = UIAlertAction(
                title: "Delete", style: .destructive) { _ in
                
                super.taskView(
                    taskView,
                    didCompleteEvent: isComplete,
                    at: indexPath,
                    sender: sender
                )
            }

            let warningAlert = UIAlertController(
                title: "Delete",
                message: "Are you sure you want to delete your response?",
                preferredStyle: .actionSheet
            )

            warningAlert.addAction(cancelAction)
            warningAlert.addAction(confirmAction)
            present(warningAlert, animated: true, completion: nil)

            return
        }

        let surveyViewController = ORKTaskViewController(
            task: survey,
            taskRun: nil
        )

        let directory = FileManager.default.urls(
            for: .documentDirectory,
            in: .userDomainMask
        ).last!.appendingPathComponent("ResearchKit", isDirectory: true)

        surveyViewController.outputDirectory = directory
        surveyViewController.delegate = self

        present(surveyViewController, animated: true, completion: nil)
    }

    // MARK: ORKTaskViewControllerDelegate
    
    open func taskViewController(
        _ taskViewController: ORKTaskViewController,
        didFinishWith reason: ORKTaskViewControllerFinishReason,
        error: Error?) {

        taskViewController.dismiss(animated: true, completion: nil)

        guard let task = controller.taskEvents.first?.first?.task else {
            assertionFailure("Task controller is missing its task")
            return
        }

        if let error = error {
            surveyDelegate?.surveyTask(
                viewController: self,
                for: task,
                didFinish: .failure(error)
            )
            return
        }

        guard reason == .completed else {
            return
        }

        let indexPath = IndexPath(item: 0, section: 0)

        guard let event = controller.eventFor(indexPath: indexPath) else {
            return
        }

        guard let values = extractOutcome(taskViewController.result) else {
            return
        }

        let outcome = OCKOutcome(
            taskUUID: event.task.uuid,
            taskOccurrenceIndex: event.scheduleEvent.occurrence,
            values: values
        )

        controller.storeManager.store.addAnyOutcome(
            outcome,
            callbackQueue: .main) { result in

            if case let .failure(error) = result {

                self.surveyDelegate?.surveyTask(
                    viewController: self,
                    for: task,
                    didFinish: .failure(error)
                )
            }

            self.surveyDelegate?.surveyTask(
                viewController: self,
                for: task,
                didFinish: .success(reason)
            )
        }
    }
}

#endif
EN

回答 1

Stack Overflow用户

发布于 2021-12-01 06:28:26

当我试图在我自己的应用程序中复制“恢复”应用程序的演示代码时,我也遇到了同样的问题。在比较了我的项目设置和“恢复”之后,我注意到我没有在我的目标应用程序的标志和功能中添加"HealthKit“的功能。在我添加了这个功能之后,它就起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68727476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档