Swiftでウィジェットを作ってみた [iOS]
概要
iOS8でSwiftでウィジェットを作る方法をさらっと書きました。 環境はXcode6-Beta3を使ってます。 アプリから入力したテキストをウィジェットに表示するだけのシンプルなものです。
手順
まずプロジェクトを作成します。ここではSingle Web Application
を選択しました。(プロジェクト名:TodayExtensionExample)
Today Extensionを使用するため新規にターゲットでToday Extension
を作成します。(ターゲット名:TodayExtension)
アプリとウィジェットでデータを共有するために今回はApp Group
を使用します。
プロジェクトのTargets->CapabilitiesからApp Group
を有効にしてGroup IDを設定します。
これはアプリとウィジェットのターゲット両方に設定してください。
ここでは"group.TodayExtensionSample"をキーとして使用します。
下準備ができたので今度は画面を作っていきます。まずはアプリの入力画面ですが、UITextField
とUIButton
を一つ配置するシンプルなものを想定しています。
UITextField
のプロパティを宣言しておきます
@IBOutlet var commentTextField: UITextField
Saveボタンをタップした際のイベントです。ここでNSUserDefaultsを使ってデータを保存します。Group IDを指定することでウィジェットとデータが共有できます。
@IBAction func saveCommentAction(sender: AnyObject) { let sharedDefaults:NSUserDefaults = NSUserDefaults(suiteName: "group.TodayExtensionSample") sharedDefaults.setObject(commentTextField.text, forKey: "textValue") sharedDefaults.synchronize() }
次にウィジェット側のUIを作ります。アプリ側で入力したテキストをラベルに表示するのでUILabel
を配置します。
次にUILabel
のプロパティを宣言します。
@IBOutlet var textLabel: UILabel
初期化時にNSUserDefaultsDidChangeNotification
で変更を検知してuserDefaultsDidChange
メソッドを呼び出すようにします
init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) NSNotificationCenter.defaultCenter().addObserver(self, selector: "userDefaultsDidChange:", name: NSUserDefaultsDidChangeNotification, object: nil) }
ウィジェットを表示するための追加の処理です
override func viewDidLoad() { super.viewDidLoad() // Auto Layoutを使用しない場合、preferredContentSizeで高さを指定する preferredContentSize = CGSizeMake(320, 50) // テキスト表示 updateTextLabel() }
アプリ側でテキストが変更されたらウィジェットに反映します
func userDefaultsDidChange(notification: NSNotification) { updateTextLabel() }
アプリ側で保存したテキストを取得してラベルに表示します
func updateTextLabel() { let defaults:NSUserDefaults = NSUserDefaults(suiteName: "group.TodayExtensionSample") textLabel.text = defaults.stringForKey("textValue") }
これでプログラムを実行してアプリでテキストを保存するとウィジェットに入力したテキストを表示することができます。
まとめ
手順自体はシンプルなのですが、Xcode6の不具合もあるのか表示するまでにいろいろ問題がありました。 それらについてまとめてあるサイトもあるので参考にしてください。