2015-08-04 3 views
1

Я относительно новичок в разработке iOS и в настоящее время использую Swift для разработки прототипа приложения ResearchKit. Одним из требований является встраивание WKWebView в ORKTask, состоящее из трех этапов: ORKQuestionStep, ORKWebViewStep, ORKCompletionStep. Я не могу найти много информации о том, как подклассы ORKStep и ORKStepViewController использовать Swift для создания настраиваемого шага. Может ли кто-нибудь направлять меня в правильном направлении для подкласса ORKStep и ORKStepViewController для отображения WKWebView с использованием Swift?Создание пользовательского ORKStep с WKWebView

Спасибо заранее! Ответ

ответ

1

Юань Чжу в ResearchKit-пользователей списка рассылки:

Я думаю, вы можете:

  1. Создание ORKActiveStep и настроить его должным образом.
  2. Внесите метод делегата - (void)taskViewController:(ORKTaskViewController *)taskViewController stepViewControllerWillAppear:(ORKStepViewController *)stepViewController.
  3. Внесите свой webView в ORKActiveStepViewController через его customView.
1

Я создал собственный ORKWebView следующим образом. Я доволен комментариями о том, как улучшить это.

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.

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 мы увидели начало() - вызов функции, мы должны быть в состоянии закончить шаг и перейти к следующему. Вот почему мы хотим, чтобы таймер был завершен сразу же после его запуска.

// 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? Если я не хочу, чтобы статический WebView всегда был одним и тем же html, в какой момент я могу установить строку html извне?

+0

Одним из косвенных решений является загрузка строки html через NSUserDefaults. Если вы знаете лучшее решение, я был бы признателен за это! – snailmensch

Смежные вопросы