ios swift 使用 NSPredicate 跳过的 ResearchKit 条件

ios swift ResearchKit condition for skip with NSPredicate

我正在使用 ResearchKit 开发一个小应用程序。不幸的是,我找不到足够的例子来弄清楚如何根据上一个问题的答案跳过一个问题。 我把下面的代码放在一起,我知道它不正常而且不起作用。 我正在寻求帮助以找出问题所在。

let textChoices2 = [

ORKTextChoice(text: "Answer 1", value: 0),

ORKTextChoice(text: "Answer 2", value: 1),

ORKTextChoice(text: "Answer 3", value: 2),

ORKTextChoice(text: "Answer 4", value: 3)
]

let questAnswerFormat2: ORKTextChoiceAnswerFormat = ORKAnswerFormat.choiceAnswerFormatWithStyle(.SingleChoice, textChoices: textChoices2)

let questQuestionStep2 = ORKQuestionStep(identifier: "TextChoiceQuestionStep2", title: questQuestionStepTitle, answer: questAnswerFormat2)

//////////////////////////// Here I need help

let task: ORKNavigableOrderedTask = ORKNavigableOrderedTask(identifier: "xyz123", steps: steps)

//the identifier for ORKNavigableOrderedTask is a random number in my case, is it ok like this?

let resultSelector: ORKResultSelector = ORKResultSelector(stepIdentifier: "TextChoiceQuestionStep", resultIdentifier: "ImageChoiceQuestionStep”)

//stepIdentifier is the question based on which I decide if I want to skip the current question. Is it ok like this?

//resultIdentifier is the question to which I want to jump to. Is it ok like this?

let predicate: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResultWithResultSelector(resultSelector, expectedAnswerValue: "0”)

//expectedAnswerValue is the value of the answer for which I want to skip the current question. Is it ok like this?

let predicateRule: ORKPredicateStepNavigationRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers:[ (predicate, "ImageChoiceQuestionStep") ])

//“ImageChoiceQuestionStep” from the row above is the question to which I want to jump to. Is it ok like this?

task.setNavigationRule(predicateRule, forTriggerStepIdentifier: "ImageChoiceQuestionStep”)

//“ImageChoiceQuestionStep” from the row above is the question to which I want to jump to. Is it ok like this?

questQuestionStep2.task = task

resultSelector (docs) 的功能是确定您希望谓词匹配的确切结果。 resultSelector 必须有一个 resultIdentifier,它在 问题步骤 中既是 问题步骤 的标识符,又是 问题结果内(不是你要跳转到的步骤的标识!)。

可选地,一个 resultSelector 可以有一个 stepIdentifier(当你想匹配 表单结果时 ,其中几个可以包含在同一个 step) 或 taskIdentifier(如果您想匹配先前完成的任务中的结果)。我认为您的用例不需要这两个。

然后,使用指向您感兴趣的问题的有效 resultSelector,您可以构建一个 结果谓词 ,并使用该谓词构建一个 ORKPredicateStepNavigationRule其中将包含 destinationStepIdentifier(这是您要跳转到的步骤)。

最后,将谓词步骤导航规则附加到必须触发规则的步骤(可以是谓词匹配的相同步骤,也可以是出现的步骤稍后在任务中)。

设置完所有内容并运行任务后,导航规则会在您离开它所附加的步骤时触发,并且destinationIdentifier包含在navigation rule中指向你有条件跳转到的步骤。

请参阅 TaskFactory.swift 文件(它实现了 ORKTest 示例项目中的 Navigable Ordered Task 项)以获取有关如何实现条件的完整示例跳上 swift.

另请查看 ORKNavigableOrderedTask, ORKPredicateStepNavigationRule and ORKResultPredicate 上的文档以获取更多信息。

我相信你可以通过使用这些来实现你想要的。


此外,还有一个正在进行的Pull Request,它将跳过导航规则的概念添加到ORKNavigableTask,这可能更适合您的需要。但我建议您首先了解一般导航规则的工作原理。希望 PR 能尽快合并。