sakaharaのブログ

アプリ開発に関する話や日々の出来事など

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"をキーとして使用します。

下準備ができたので今度は画面を作っていきます。まずはアプリの入力画面ですが、UITextFieldUIButtonを一つ配置するシンプルなものを想定しています。

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の不具合もあるのか表示するまでにいろいろ問題がありました。 それらについてまとめてあるサイトもあるので参考にしてください。

http://qiita.com/wao9@github/items/d983811ac48b71ffe072