2016-06-24 9 views
1

Ich möchte meinen eigenen ResearchKit-Schritt implementieren, einschließlich einer WebView, in der eine Schaltfläche die Möglichkeit bietet, zum nächsten Schritt zu wechseln.Researchkit: So wechseln Sie manuell aus UIWebView zum nächsten Schritt

ist es daher möglich,

1) Manuelles Initiieren zum nächsten Schritt zu wechseln?

2) manipulieren Sie das Ergebnis, erhalten einige Daten von meinem WebView?

zu Lernzwecken habe ich bisher folgende, meine eigene ActiveStep einschließlich:

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

Können Sie diese Frage auf dem GitHub? – Yuan

+0

Ok, habe das hier: https://github.com/ResearchKit/ResearchKit/issues/742 Ich hoffe, das war der richtige Weg ... – snailmensch

+0

Ich könnte Teil eins meiner Frage beantworten, die ich hier getan habe: http: //stackoverflow.com/questions/31806199/creating-custom-orkstep-with-wkwebview/38051000#38051000 – snailmensch

Antwort

1

ich das Problem wie folgt gelöst:

1) eine WKWebView scriptmessagehandler verwenden, die das Ergebnis von Javascript erhält . Sobald der Nachrichtenhandler ein Ergebnis erhält, startet er den Timer der ActiveTask, der auf einen sehr kleinen Wert gesetzt ist.

Sie können meine Implementierung hier als Antwort auf eine andere Stackoverflow Frage sehen: Creating custom ORKStep with WKWebView

2) Um den Schritt Ergebnis in die Aufgabe, ich hatte nur das Ergebnis Eigenschaft in der Steuerung meiner Schritt Ansicht außer Kraft zu setzen.

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() 
    } 
    } 
Verwandte Themen