使用WKWebView创建自定义ORKStep [英] Creating custom ORKStep with WKWebView

查看:143
本文介绍了使用WKWebView创建自定义ORKStep的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对iOS开发相对较新,目前正在使用Swift开发一个原型ResearchKit应用程序。其中一个要求是在 ORKTask 中嵌入一个 WKWebView ,其中包含三个步骤: ORKQuestionStep ORKWebViewStep ORKCompletionStep 。我似乎无法找到有关如何使用Swift创建自定义步骤的子类 ORKStep ORKStepViewController 的更多信息。有人可以指导我正确的方向如何子类 ORKStep ORKStepViewController 来显示 WKWebView 使用Swift?

I'm relatively new to iOS development, and currently using Swift to develop a prototype ResearchKit app. One of the requirements is to embed a WKWebView in an ORKTask consisting of three steps: ORKQuestionStep, ORKWebViewStep, ORKCompletionStep. I can't seem to find much information on how to subclass ORKStep and ORKStepViewController using Swift to create a custom step. Can someone guide me in the right direction for how to subclass ORKStep and ORKStepViewController to display a WKWebView using Swift?

提前谢谢!

推荐答案

我已经构建了自己的ORKWebView,如下所示。我对如何改进它的评论感到高兴。

I have build my own ORKWebView as follows. I am happy about comments on how to improve that.

1。子类ORKActiveStep

class Javascript_Step : ORKActiveStep {
    static func stepViewControllerClass ( ) -> Javascript_Step_View_Controller.Type {
        return Javascript_Step_View_Controller.self
    }    
}

2。子类ORKActiveStepViewController

在这里,您将修改WebView及其组件。
为了退出WebView并传递结果,我使用Javascript。

Here you will modify your WebView and it's components. For quitting the WebView and passing the result, I use Javascript.

import Foundation
import ResearchKit
import WebKit

class Javascript_Step_View_Controller : ORKActiveStepViewController, WKScriptMessageHandler {
    weak var webView: WKWebView!
    var html : String = "<!DOCTYPE html><html><head>  <meta charset=\"UTF-8\">  <title>JS Widget</title>  <style type=\"text/css\">    h1 {      color: red    }  </style></head><body>  <h1>Test</h1>  <input type=\"button\" value=\"Say hello\" onClick=\"Finish_This_Widget('Result is String')\" />  <script type=\"text/javascript\">    function Finish_This_Widget(string) {      App.Finish_Widget(string)    }  </script></body></html>"

    // Here the result message posted by Javascript can be handled
    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
        if let result = message.body as? String {
            print("userContentController: \(result)")
            // With the incoming reult of your webview, the ORKActiveStep timer will be started
            start()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Here you set the function name to call from javascript
        let controller = WKUserContentController()
        controller.addScriptMessageHandler(self, name: "Finish_Widget")

        let config = WKWebViewConfiguration()
        config.userContentController = controller

        let frame = CGRectMake(20, 20, 200, 200)
        let webView = WKWebView(frame: frame, configuration: config)
        self.customView = webView

        // Set the view constraints (warning message with following unproper settings)
        self.customView?.superview!.translatesAutoresizingMaskIntoConstraints = false
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[demoView]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["demoView": webView]))        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[demoView]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["demoView": webView]))

        // Load the html string
        webView.loadHTMLString(html, baseURL: NSBundle.mainBundle().bundleURL)

        webView.translatesAutoresizingMaskIntoConstraints = false
        self.webView = webView
    }

}

3。使用WebViewStep加载任务

在第2步中,我们看到了start() - 函数调用,我们需要能够完成该步骤并切换到下一个。这就是为什么我们希望计时器在我们启动后立即完成。

In step 2 we saw the start()-function call we need be able to finish the step and to switch to the next one. That's why we want that the timer is finished immediately after we started it.

// This functions gives you the Step you can work with finanlly
func Javascript_Widget_Step ( identifier : String, title : String, text : String ) -> ORKActiveStep {
    let active_Step = Javascript_Step(identifier: identifier)

    // Set title and text for the step (which is optional)
    active_Step.title = title
    active_Step.text = text

    // set stepduration to a minimum -> after javascript function call, step will be finished
    active_Step.stepDuration = 0.001

    // if this is false, it will not switch to the next step after the javascript call automatically
    active_Step.shouldContinueOnFinish = true
    return active_Step
}

打开问题

如何注入html?如果我不想要一个总是使用相同html的静态WebView,那么我可以从外面设置html字符串吗?

How can I inject the html? If I don't want a static WebView with always the same html, at which point can I set the html string from outside?

这篇关于使用WKWebView创建自定义ORKStep的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆