2016-06-24 1 views
1

Я хочу реализовать свой собственный шаг ResearchKit, включая WebView, в котором кнопка дает возможность перейти к следующему шагу.Researchkit: Как перейти на следующий шаг вручную из UIWebView

ли поэтому возможно

1) инициирует переключение к следующему шагу вручную?

2) управляет результатом, получая некоторые данные из моего WebView?

Для целей обучения я создал следующие до сих пор, включая мою собственную ActiveStep:

import UIKit 
import ResearchKit 
class DemoView: UIWebView { 

} 
class DemoStepViewController : ORKActiveStepViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let demoView = UIWebView() 
     demoView.loadHTMLString("<html><body><p>Hello!</p></body></html>", baseURL: nil) 
     demoView.translatesAutoresizingMaskIntoConstraints = false 
     self.customView = demoView 
     self.customView?.superview!.translatesAutoresizingMaskIntoConstraints = false 
     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[demoView]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["demoView": demoView])) 
     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[demoView]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["demoView": demoView])) 
    } 
} 
class DemoStep : ORKActiveStep { 
    static func stepViewControllerClass() -> DemoStepViewController.Type { 
     return DemoStepViewController.self 
    } 
} 
@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, ORKTaskViewControllerDelegate { 
    var window: UIWindow? 
    var taskResultFinishedCompletionHandler: (ORKResult -> Void)? 
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     let activeStep = DemoStep(identifier: "webstep") 
     activeStep.title = "Demo Step" 
     var endStep = ORKCompletionStep(identifier: "endstep") 
     endStep.title = "Well done" 
     endStep.text = "thank you" 
     let task = ORKOrderedTask(identifier: "orderedtask", steps: [activeStep, endStep]) 
     let taskViewController = ORKTaskViewController(task: task, taskRunUUID: nil) 
     taskViewController.delegate = self 
     taskViewController.outputDirectory = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String, isDirectory: true) 
     window?.rootViewController = taskViewController 
     return true 
    } 
    func taskViewController(taskViewController: ORKTaskViewController, didFinishWithReason reason: ORKTaskViewControllerFinishReason, error: NSError?) { 
     taskResultFinishedCompletionHandler?(taskViewController.result) 
     taskViewController.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 
+0

Можете ли вы опубликовать этот вопрос на github? – Yuan

+0

Хорошо, сделал это здесь: https://github.com/ResearchKit/ResearchKit/issues/742 Надеюсь, это был правильный путь ... – snailmensch

+0

Я мог ответить на один из моих вопросов, который я здесь сделал: http: //stackoverflow.com/questions/31806199/creating-custom-orkstep-with-wkwebview/38051000#38051000 – snailmensch

ответ

1

Я решил проблему так:

1) Используйте WKWebView scriptmessagehandler, который получает результат от JavaScript , Как только обработчик сообщения получает результат, он запускает таймер ActiveTask, который установлен на очень маленькое значение.

Вы можете увидеть мою реализацию здесь ответ на другой StackOverflow вопрос: Creating custom ORKStep with WKWebView

2) Чтобы включить шаг результат в задаче, я просто должен переопределить свойство результата на мой взгляд, шаг регулятора.

var JS_Answer = ORKTextQuestionResult() 

    override var result : ORKStepResult? { 
    let step_Result = super.result! 
    step_Result.results = [JS_Answer] // result will look up the answer here 
    return step_Result 
    } 

    // Handle the message posted by Javascript 
    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) { 
    if let widget_Result = message.body as? String { 
     JS_Answer.identifier = step!.identifier 
     // write the answer from WebView to JS_Answer, which will be accessed by result 
     JS_Answer.textAnswer = widget_Result 
     start() 
    } 
    } 
Смежные вопросы