Monthly Archives: April 2015

Swift:UIWebView でローカルの htmlファイルを表示させる

アプリ内のお知らせやマニュアル等の静的なテキストファイルや画像等を、iOS のネイティブ UI を使って Auto Layout やコードで記述するのはとても面倒です。 こういった場合、あらかじめ HTML でコンテンツを作成しローカルに保存しておき、その html ファイルを UIWebView で表示させればいいかと思います。 今回は UIWebView にローカルの html ファイルを表示させてみたいと思います。 UIWebView でローカルの htmlファイルを表示させる ViewController クラスの WebViewController.swift と、表示させたい HTML ファイル(ここでは index.html)を用意し、index.html を表示したいと思います。 手順は以下の通りです。 プロジェクトに index.html をコピーする WebViewController で UIWebView のデリゲートを宣言する UIWebView を生成する UIWebView に index.html を表示させる プロジェクトに index.html をコピーする 以下のような index.html を準備し、HTML ファイルをプロジェクトにドラッグしてコピーします。 このとき、head タグ内に CSS ファイルをリンクすれば HTML に CSS のスタイルが適用されます。 WebViewController で UIWebView のデリゲートを宣言する ViewController クラスの WebViewController.swift を作成し、UIWebView のデリゲートを宣言します。 UIWebView を生成する UIWebView を生成し、ViewController の viewDidLoad から addSubView します。 UIWebView に index.html を表示させる index.html を読み込むために以下の func loadRequest を作成し、viewDidLoad で loadRequest を実行すると index.html が表示されます。 サンプルコード 上記で説明した WebViewController のサンプルコードです。 WebViewController.swift index.html まとめ 当然ですが URL をリモートのアドレスに変更すればリモートの html を表示することも可能です。 マニュアルやクレジット表記等、アプリ内に必要な情報は HTML で作成しておけば、ローカル、リモートに関わらずメンテナンスがしやすくなります。 Xcode 上で html/css の作成や編集も可能です。ある程度 HTML/CSS コーディングに慣れている方は、一度試してみるといいかと思います。 この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

Swift:delegate(デリゲートパターン)の使い方とサンプルコード

アプリ制作に必須な知識にも関わらず、なかなかわかりづらい delegate ですが、一度覚えてしまえば、何が分からなかったのかが分からないくらい分かりやすいデザインパターンであることに気づきます。 今回はこの delegate について分かりやすく説明してみたいと思います。 デリゲートパターンについて デリゲートパターンでできる事は、delegate の意味の通り、ViewController(あるクラス) の処理を、別の ViewController(あるクラス) へ任せる事です。 もっと厳密に言えば、あるクラスに実装している処理を、そのクラスのインスタンスを生成している別のクラス(ViewController)側で処理したい場合にデリゲートパターンを使用します。 次項で具体的な使い方を見て行きたいと思います。 デリゲートパターンの使い方 使用例として、デリゲートパターンを使用し MainViewController 内の SpriteKit シーンファイル MainScene から MainViewController へ、シーンがタッチされたことを通知したいと思います。 大まかな流れは以下のようになります。 MainScene クラスを作成しプロトコルを実装する MainScene クラスからデリゲートメソッドを呼ぶ MainViewController に MainScene クラスのデリゲート(委譲)を宣言する MainViewController に MainScene クラスのプロトコルで定義したデリゲートメソッドを実装する MainScene クラスを作成しプロトコルを実装する MainScene.swift を作成し、touchesBegan をオーバライドします。 MainScene.swift の先頭にプロトコルを記述し、mainSceneDelegate をクラス内で宣言します。 MainScene クラスからデリゲートメソッドを呼ぶ touchBegan からデリゲートメソッドを呼びます。 MainViewController に MainScene クラスのデリゲート(委譲)を宣言する class MainViewController: UIViewController の後にカンマで区切り、MainSceneDelegate を追加します。 MainViewController に MainScene クラスのプロトコルで定義したデリゲートメソッドを実装する viewDidLoad() の下に sceneTouched() を実装します。 結果 ビルドし、表示された画面(MainScene)をタッチすると MainViewController の sceneTouched() が呼ばれているのが確認できます。 デリゲートパターンサンプル 上記 MainViewController.swift と MainScene.swift のサンプルコードです。 MainViewController.swift MainScene.swift まとめ ViewController 間の値の受け渡し方法は、AppDelegate 内でグローバル変数を使用する方法等がありますが、delegate パターンを使用すれば、クラス内でなにが行われているかを意識することなく、クラスで処理された結果を受け取ることができます。 クラスはクラス内での役割(処理)を、クラスのインスタンスを生成した側ではクラスで行われた処理の結果を使ってどうするか、といった役割分担が分かりやすく記述できるため、コードの可読性が上がりメンテナンスが容易になります。 最初はどこにプロトコルを書くのか考えたり、どっちにデリゲートメソッドを書くのかを混同しがちですが、デリゲートパターンの意図を理解できれば、自然と使いこなせるようになります。 デリゲートパターンを使って、誰が見ても分かりやすいコーディングを心がけたいと思います。 この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

Swift:println で様々な値を出力する

Objective-C ではデバッグ等で NSLog を使用していましたが、 Swift では主に print や println を使用するかと思います。 println はジェネリクスで定義されているので、文字列にに限らず変数やクラス等も簡単に出力結果が得られ、かつ NSLog よりも高速です。 println と print の違いは、出力時に改行があるかないかだけです。ログの出力結果に改行が入ってないと視認性が悪くなるため通常は println を使用することになるかと思います。 今回はこの println で様々な値を出力してみたいと思います。 println で様々な値を出力する 文字列 文字列は”(ダブルコーテーション)で括ります。 変数 変数はそのまま記述します。文字列の中で変数を出力したいときはバックスラッシュ \ の後()で括ります。 Bool も同じくそのまま記述すれば出力されます。 記号 記号を出力したい場合はエスケープ文字の \(バックスラッシュ)を使用します。 float UIColor その他 まとめ println は NSLog よりも記述がシンプルなうえ高速です。 慣れないうちは、各クラスの関数やメソッドの先頭に println を記述し、引数や返り値を常に出力するようにしていれば、アプリの動きを理解しやすくなり、デバッグ等に役立ちます。NSLog より高速ですのでどんどん使っていきましょう。 この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

Swift:Optional についての概要と基本的な使い方

Objective-C から iOSアプリの開発を始めた人でも Swift に慣れるにはそれなりにコストがかかります。 Swift を学び始めて誰もが最初に気づく Objective-C との違いは、変数の後に付く ? や !(Optional変数)だと思います。 今回はこの Optional について自分なりにまとめてみようと思います。 optional について まず最初に、Optional というのは型です。Int の Optional型、String の Optional型、といった表現をします。 変数の型が Optional かそうでないかの違いは、変数に nil が入る(もしくは入るかもしれない)か、そうでないかの違いとなります。 このように Optional は nil が入る(かもしれない)値を明示的にする目的で使用されます。 Optional の宣言 Optional の宣言は ? で宣言する方法と ! で宣言する方法があります。 両者の違いは次項で説明するアンラップに関係します。 ? は一般的な Optional 型 ! は暗黙的にアンラップされる Implicitly Unwrapped Optional 型 で、この2つは同じ Optional 型のように扱われがちですが、全然別物です。 はじめに言っておくと ! は特別なことがない限り使用しないほうがいいです。 Optional のアンラップ Optional 型から値を取り出すことをアンラップするといいます。 Optional のアンラップにはいくつか方法があります。 フォースド・アンラッピング (Forced Unwrapping) 読んだ意味そのまま、強制的に値を取り出す方法で ! を使用し値を取り出します。 Optional 変数を通常の変数のように、そのまま出力しようとするとエラーになります。 Optional 変数が nil だった場合にもエラーとなります。 オプショナル・チェインニング (Optional Chaining) ? を使用し値を取り出します。 値が nil だった場合は nil を返します。 オプショナル・バインディング (Optional Binding) Optional 型の変数を代入された変数が、非 Optional 型になることを利用しアンラップする方法です。 上記の例の場合、if で string に値が代入できるイコール optionalStr が nil ではない、という意味となるため、もし optionalStr が nil の場合は println は実行されません。冗長にも思われますが、オプショナル・バインディングを使用すると nil を意識したコーディングとなります。 暗黙的アンラップ (Implicitly Unwrapped Optional) 冒頭で述べた ! で宣言をおこなった値は暗黙的にアンラップされます。 値が nil の場合にはエラーとなります。 このように Implicitly Unwrapped Optional で宣言すると、一見して普通の変数のように扱えるため、Optional に対しての理解がないと ! を乱用してしまいがちです(自分はそうでした)。 ただ、これでは Optional を使用するメリットである nil が入る(かもしれない)値を明示的にする、という意味がなくなってしまいます。 ! での Optional 宣言は、オブジェクトの初期化のときに「どうしても初期値が nil でなければいけない場合」にのみ使用するものとなります。 宣言時は nil にするしかないが、宣言後には常に何かの値が入っていることを前提とした場合にのみ ! (Implicitly Unwrapped Optional) で宣言すればよいでしょう。 まとめ Optional は 基本的には ? を宣言し使用することで、Optional の目的である nil を意識したコーディングが行え、コンパイラの nil 値のチェックが容易になります。 nil を返す(かもしれない)関数の戻り値を処理する場合はオプショナル・バインディングのように、まず Optional 変数で受け取り、Optional のラッピングを解いて処理をする という使い方ができるようになります。 Optional 型に慣れるまではコーディング中やビルド時に、幾度と無くエラーとなってしまいますが、そのほとんどは Xcode が自動で対処(サジェスト)してくれるため、まずはガンガン使ってみるのが一番の習得方法だと思います。 この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。