スクリーンレットアクションの追加
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、こちらまでご連絡ください。
複数のインタラクターを使用すると、スクリーンレットに複数のアクションを含めることができます。 アクションごとにInteractorクラスを作成する必要があります。 たとえば、スクリーンレットで2つのサーバー呼び出しを行う必要がある場合は、呼び出しごとに1つずつ、2つのインターアクターが必要です。 Screenletクラスの createInteractor
メソッドは、各Interactorのインスタンスを返す必要があります。 また、各アクション名は、それらをトリガーするUIコンポーネントの restoreIdentifier
によって指定されることを思い出してください。 Screenletでこの restoreIdentifier
を定数に設定する必要があります。
このチュートリアルでは、スクリーンレットにアクションを追加し、プログラムでアクションをトリガーするために必要な手順を説明します。 例として、このチュートリアルでは、サンプルAdd Bookmark Screenlet高度なバージョン
使用し 。 このScreenletは、サンプルに似ているブックマークScreenletで作成した追加 Screenlet作成チュートリアル。 ただし、高度なブックマークの追加スクリーンレットには、次の2つのアクションが含まれています。
-
ブックマークの追加:Liferay DXPインストールのブックマークポートレットにブックマークを追加します。 これで作成したScreenletの主な行動であり、 Screenlet作成チュートリアル。
-
タイトルを取得:ユーザーが入力したブックマークURLからタイトルを取得します。 このチュートリアルでは、このアクションを実装する方法を示します。
このチュートリアルでは、一般的なスクリーンレットの作成については説明していません。 先に進む前に、必ず読んで作る Screenlet作成チュートリアル。 さらに苦労することなく、今度はスクリーンレットのアクションを実装しましょう!
アクションを実装する
次の手順を使用して、スクリーンレットにアクションを追加します。
-
スクリーンレットのアクションごとに、スクリーンレットクラスに定数を作成します。 たとえば、Add Bookmark ScreenletのScreenletクラス(
AddBookmarkScreenlet
)の定数は次のとおりです。static let AddBookmarkAction = "add-bookmark" static let GetTitleAction = "get-title"
-
テーマのXIBファイルに、アクションの実行に必要な新しいUIコンポーネントを追加します。 たとえば、Add Boookmark ScreenletのXIBファイルには、URLのタイトルを取得するための新しいボタンが必要です。
-
XIBファイルのUIコンポーネントをViewクラスに配線します。 Viewクラスでは、反応するイベント(ボタンのクリックなど)も登録する必要があります。
BaseScreenletView
クラス は、Viewクラスで呼び出してアクションをプログラムで実行できるuserAction
メソッドのセットが含まれています。 たとえば、ユーザーがURLTextField
離れるたびに、Add Bookmark ScreenletのGetTitleAction
自動的にトリガーすることができます。BaseScreenletView
はデフォルトでUITextField
オブジェクトすべてのデリゲートであるため、これはViewクラス(AddBookmarkView_default
)でtextFieldDidEndEditing
メソッド を実装してアクション名でuserAction
メソッドを呼び出すことで行われます:func textFieldDidEndEditing(textField: UITextField) { if textField == URLTextField { userAction(name: AddBookmarkScreenlet.GetTitleAction) } }
-
ViewクラスまたはView Modelプロトコルを更新して、新しいアクションに対応します。 例えば、ブックマークScreenletビューモデル(含まれています
AddBookmarkViewModel
)それができるよう、 をサポート、複数のテーマ。 このビューモデルは、新しいアクションがタイトル
変数を設定できるようにする必要があります。import UIKit @objc protocol AddBookmarkViewModel { var URL: String? {get} var title: String? {set get} }
-
スクリーンレットがビューモデルを使用している場合、ビュークラスを更新されたビューモデルに適合させます。 たとえば、Add Bookmark ScreenletのViewクラスの
title
変数(AddBookmarkView_default
)は、前のステップのセッターを実装する必要があります。var title: String? { get { return titleTextField?.text } set { self.titleTextField?.text = newValue } }
-
新しいアクションの新しいInteractorクラスを作成します。 これを行うには、 スクリーンレット作成チュートリアル説明されているのと同じ手順を使用します。 たとえば、ブックマークスクリーンレットの追加のタイトル取得アクションのInteractorクラスは次のとおりです。
import UIKit import LiferayScreens public class GetWebTitleInteractor: Interactor { public var resultTitle: String? var url: String //MARK: Initializer public init(screenlet: BaseScreenlet, url: String) { self.url = url super.init(screenlet: screenlet) } override public func start() -> Bool { if let URL = NSURL(string: url) { // Use the NSURLSession class to retrieve the HTML NSURLSession.sharedSession().dataTaskWithURL(URL) { (data, response, error) in if let errorValue = error { self.callOnFailure(errorValue) } else { if let data = data, html = NSString(data: data, encoding: NSUTF8StringEncoding) { self.resultTitle = self.parseTitle(html) } self.callOnSuccess() } }.resume() return true } return false } // Parse the title from a webpage HTML private func parseTitle(html: NSString) -> String { let range1 = html.rangeOfString("<title>") let range2 = html.rangeOfString("</title>") let start = range1.location + range1.length return html.substringWithRange(NSMakeRange(start, range2.location - start)) } }
-
Screenletクラスの
createInteractor
メソッドを更新して、各アクションに対して正しいInteractorを返すようにします。 たとえば、Add Bookmark ScreenletのScreenletクラス(AddBookmarkScreenlet
)のcreateInteractor
メソッドには、Add BookmarkまたはGet Titleアクションが呼び出されたときにAddBookmarkInteractor
またはGetWebTitleInteractor
インスタンスをそれぞれ返すswitch
ステートメントが含まれています。createAddBookmarkInteractor()
およびcreateGetTitleInteractor()
メソッドがこれらのインスタンスを作成することに注意してください。 Interactorインスタンスを個別のメソッドで作成する必要はありませんが、そうすることでコードが簡潔になります。... override public func createInteractor(name name: String, sender: AnyObject?) -> Interactor? { switch name { case AddBookmarkScreenlet.AddBookmarkAction: return createAddBookmarkInteractor() case AddBookmarkScreenlet.GetTitleAction: return createGetTitleInteractor() default: return nil } } private func createAddBookmarkInteractor() -> Interactor { let interactor = AddBookmarkInteractor(screenlet: self, folderId: folderId, title: viewModel.title!, url: viewModel.URL!) // Called when the Interactor finishes succesfully interactor.onSuccess = { let bookmarkName = interactor.resultBookmarkInfo!["name"] as! String print("Bookmark \"\(bookmarkName)\" saved!") } // Called when the Interactor finishes with an error interactor.onFailure = { _ in print("An error occurred saving the bookmark") } return interactor } private func createGetTitleInteractor() -> Interactor { let interactor = GetWebTitleInteractor(screenlet: self, url: viewModel.URL!) // Called when the Interactor finishes succesfully interactor.onSuccess = { let title = interactor.resultTitle self.viewModel.title = title } // Called when the Interactor finishes with an error interactor.onFailure = { _ in print("An error occurred retrieving the title") } return interactor } ...
すばらしいです\! これで、スクリーンレットで複数のアクションをサポートする方法がわかりました。 次のセクションでは、プログラムでアクションをトリガーする方法を示します。