ラベル Swift の投稿を表示しています。 すべての投稿を表示
ラベル Swift の投稿を表示しています。 すべての投稿を表示

2015年8月7日金曜日

Swiftではじめるアプリ作成 storyboardでUIViewに影や角丸を設定する

  • 公開日:2015年08月07日

記事概要


Swiftを使ったアプリ作成で、storyboardでUIViewに角丸や影を設定する方法をまとめました

開発環境


  • Xcode 6.4
  • Swift 1.2

難易度


★★☆☆☆(易しい)

プロジェクトのひな形の作成


まず最初にiphoneプロジェクトのひな形から作成していきます。
今回は、AutoLayoutの記事で利用したプロジェクトをそのまま利用します。

UIViewに角丸を設定する


次に、Main.storyboradで画面UIを作成します。

上記の画面はUIViewを表示しています。このUIViewを角丸に設定します。
User-Defined Runtime Attributesの欄にkey Pathを設定します。
角丸を設定するにはlayer.cornerRadiuslayer.masksToBoundsを設定します。

ビルドしてiphoneシュミレーターを立ち上げて画面を確認します。

UIViewが角丸になって表示されています。

UIViewに影を設定する


角丸の設定と同じで、User-Defined Runtime Attributesの欄にkey Pathを設定します。

影を設定するには、layer.shadowIBColor,layer.shadowOpacity,layer.shadowOffset,layer.shadowRadiusを設定します。

ここで大切なのは、上記で設定したlayer.masksToBoundsfalseにすることです。
layer.masksToBoundsは、viewの境界をはみ出すかはみ出さないかを設定します。trueではみ出さないようにし、falseではみ出しますようにします。
影はviewの外側に表示します。なので、layer.masksToBoundsはfalseにする必要があります。

ビルドしてiphoneシュミレーターを立ち上げて画面を確認します。

UIViewの外側に影が表示されました。成功です。

storyboradを使ったほうがコードで書くよりも、バグの混入する確率が減ります。storyboradは積極的に利用していきたいですね。

以上です

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

他のswiftに関する記事 参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月31日金曜日

Swiftではじめるアプリ作成 UIをAutoLayoutで調整する

  • 公開日:2015年07月31日

記事概要


Swiftを使ったアプリ作成で、storyboardを使用してAutoLayoutを設定する方法をまとめました

開発環境


  • Xcode 6.4
  • Swift 1.2

難易度


★★☆☆☆(易しい)

プロジェクトのひな形の作成


まず最初にiphoneプロジェクトのひな形から作成していきます。
xcodeを立ち上げて、プロジェクトを作成します。

iOS → ApplicationSingle View Applicationを選択します。

  • Product Nameにautolayout-swiftと入力
  • Organization Nameに組織名称(ここではcom.masa)と入力
  • Organization Identifierに組織名称(ここではcom.masa)と入力
  • LangugageSwiftを選択
  • Deviceiphoneを選択
  • Use Core Dataのチェックボックスを外す

プロジェクトフォルダを選択すると、上記のようにプロジェクトが作成されます。

AutoLayoutの設定


次に、Main.storyboradで画面UIを作成します。
ViewControllerにUIViewオブジェクトを設定します。上下左右に余白ができるようにUIViewを配置します。

ビルドしてiphoneシュミレーターを立ち上げて画面を確認します。

上下左右に余白ができるように配置したはずのUIViewが画面からはみ出して表示されています。
意図した通りに表示されていません。
これを画面内に収まるように、AutoLayoutを使って修正します。

storyboradでUIViewを選択して、右下の四角ボタンをクリックします。

Add New Constraintsというポップアップ画面が表示されます。

上下左右に余白の値を設定します。線をクリックして太い赤線になることを確認してください。

add Constraintsボタンをクリックして、AutoLayoutを有効にします。

再ビルドして画面を確認します。

上下左右に余白ができて表示されました。成功です。

AutoLayoutをコードで実装すると、結構な量になります。なので、storyboradを使ったほうがコードで書くよりも、バグが混入する確率が減ります。AutoLayoutを利用する場合は、storyboradは積極的に利用していきたいですね。

以上です

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

他のswiftに関する記事

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月30日木曜日

Swiftではじめるアプリ作成 CocoaPodsでAlamofireとSwiftJsonを使ってアプリを作る その3

  • 公開日:2015年07月30日

記事概要


その2の続きです。SwiftJsonを利用してjsonデータを扱います。
jsonデータは、livedoor天気情報のお天気Webサービス『Weather Hacks 』を使ってAlamofireから取得したデータを使って説明したいと思います。

開発環境


  • Xcode 6.4
  • Swift 1.2

難易度


★★★☆☆(普通)

Alamofireの実装


前回のプロジェクトで作成したViewControllerに処理を記載します。

【swift】

import UIKit
// 追加
import SwiftyJSON
import Alamofire


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

SwiftyJSONを利用するには、宣言に『import SwiftyJSON』と記載します。
Alamofireをimportしている場合は、『import Alamofire』の上に記載してください。
私の環境では、import Alamofire』の下に記載すると『load module error』が発生しました。

json処理


swiftのjsonを扱い方を学びます。

Dictionary処理

【swift】

    // AlamofireでGET REQUESTを送信し、JSONデータを加工する
    func requestAlamofire() {
        Alamofire.request(.GET, "http://weather.livedoor.com/forecast/webservice/json/v1", parameters: ["city": 200010])
            .responseJSON { (request, response, json, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    var swiftJson = JSON(json!)
                    self.outputLocation(swiftJson)
                    
                } else {
                    // error
                    println(error)
                }
        }

    }

    // Locationデータを出力します
    func outputLocation(json : JSON) {
        if let location: Dictionary = json["location"].dictionary {
            println("dictionary data")
            println(location)
        } else {
            println("dictionary data")
        }

    }

上記はjsonファイルのlocationデータをswiftで扱えるように処理しています。
データはDictionaryデータです。

結果確認


上記のコードをビルドして、dubugログを見ると、以下のデータが出力されているのが確認できます。

【log】

success
dictionary data
[city: 長野, prefecture: 長野県, area: 信越・北陸]

jsonデータがきちんと取得できているのが確認できました。
このように出力したいデータを簡単に加工することができます。

まとめ


AlamofireとSwiftJsonを使うことで、アプリの作成時間を大幅に短縮できます。
その分UIやUXに時間を避けるはずです。
限られた時間をうまく使い、より良いアプリを作っていきましょう。

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

関連記事

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月29日水曜日

Swiftではじめるアプリ作成 CocoaPodsでAlamofireとSwiftJsonを使ってアプリを作る その2

  • 公開日:2015年07月29日
  • 最終更新日:2015年07月30日

記事概要


その1の続きです。Alamofireを利用してWEB APIに接続します。
この記事では、livedoor天気情報のお天気Webサービス『Weather Hacks 』を使ってAlamofireの使い方を説明したいと思います。

開発環境


  • Xcode 6.4
  • Swift 1.2

難易度


★★★☆☆(普通)

Alamofireの実装


前回のプロジェクトで作成した(自動でされた)ViewControllerに処理を記載します。

【swift】

import UIKit
// 追加
import Alamofire


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

Alamofireを利用するには、宣言に『import Alamofire』と記載します。
こうすることでAlamofireのライブラリが利用可能になります。

request処理


最初に、request処理を記載します。
Weather HacksのAPIにGET処理を送ります。

【almojson/Gemfile】

import UIKit
import Alamofire


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        requestAlamofire()
    }
    
    // AlamofireでGET REQUESTを送信
    func requestAlamofire() {
        Alamofire.request(.GET, "http://weather.livedoor.com/forecast/webservice/json/v1", parameters: ["city": 200010])
            .responseJSON { (request, response, JSON, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    println(JSON)
                } else {
                    // error
                    println(error)
                }
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

第一引数にRESTの種類、第二引数にurl、第三引数にパラメーターを設定します。

結果確認


上記のコードをビルドして、dubugログを見ると、以下のデータが出力されているのが確認できます。

success
Optional({
    copyright =     {
        image =         {
            height = 26;
            link = "http://weather.livedoor.com/";
            title = "livedoor \U5929\U6c17\U60c5\U5831";
            url = "http://weather.livedoor.com/img/cmn/livedoor.gif";
            width = 118;
        };
        link = "http://weather.livedoor.com/";
        provider =         (
                        {
                link = "http://tenki.jp/";
                name = "\U65e5\U672c\U6c17\U8c61\U5354\U4f1a";
            }
        );
        title = "(C) LINE Corporation";
    };

    // 長いので省略
    publicTime = "2015-07-04T17:00:00+0900";
    title = "\U9577\U91ce\U770c \U9577\U91ce \U306e\U5929\U6c17";
})


jsonデータがきちんと取得できているのが確認できました。
次回は、SwiftJsonを使ってこのjsonデータを扱います。

以上です。

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

関連する記事

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月28日火曜日

Swiftではじめるアプリ作成 CocoaPodsでAlamofireとSwiftJsonを使ったアプリを作る その1

  • 公開日:2015年07月28日
  • 最終更新日:2015年07月30日

記事概要


ネットワークでAPI等を利用するiphoneアプリを作成する場合、SwiftではAlamofireとSwiftJsonを利用すると便利です。
この記事では、CocoaPodsを使ったAlamofireとSwiftJsonの導入方法を丁寧に説明したいと思います。

開発環境


  • Xcode 6.4
  • Swift 1.2

難易度


★★★☆☆(普通)

プロジェクトのひな形の作成


まず最初にiphoneプロジェクトのひな形から作成していきます。
xcodeを立ち上げて、プロジェクトを作成します。

iOS → ApplicationSingle View Applicationを選択します。

  • Product Nameにalmo-swiftと入力
  • Organization Nameに組織名称(ここではcom.masa)と入力
  • Organization Identifierに組織名称(ここではcom.masa)と入力
  • LangugageSwiftを選択
  • Deviceiphoneを選択
  • Use Core Dataのチェックボックスを外す

プロジェクトフォルダを選択すると、上記のようにプロジェクトが作成されます。
次は、iphoneアプリプロジェクトのパッケージ管理にcocoapodsを導入します。
cocoapodsは開発に便利なパッケージの導入や管理をしてくれるツールです。

では、xcodeを閉じましょう。macのターミナルを開いて、プロジェクトフォルダまで移動します。

【terminal】

// プロジェクトフォルダに移動
cd /Users/{username}/Documents/iworksample/almo-swift/

// Gemfileを作成
touch Gemfile

プロジェクト配下にGemfileを作成します。
作成したGemfileはcocoapodsのインストールに使用します。
GemfileはBundler用の設定ファイルです。Bundlerはgemのバージョン管理を行うプログラムです。
この辺の知識や技術はRubyの開発の経験があると理解しやすいのですが、cocoapodsの導入だけでRubyの学習をする必要はありません。なので、理解なしに手順通り作業を進めて問題ありません。

また、cocoapodsの導入にはRubyが必要なので、Rubyが未インストールの人は、最初にRubyをインストールしておく必要があります。(この記事ではRubyがインストール出来ている前提で話を進めます)

Gemfileの記載とCocoaPodsのインストール


Gemfileを記載してCocoaPodsをインストールします。
Gemfileには、以下のように記載します。

【almojson/Gemfile】

source 'https://rubygems.org'
gem 'cocoapods', '0.36.0'

上記のGemfileを保存します。
cocoapodsのバージョンは0.36.0を利用します。
cocoapodsのバージョンはプロジェクトの全員が同じバージョンを利用するようにしましょう。

次にRubyを使ってcocoapodsをインストールします。
ここでは、bundler(RubyのGemパッケージの管理)を使用しているので、bundle installコマンドを使います。

【terminal】

bundle install --path=vendor/bundle

Fetching gem metadata from https://rubygems.org/...........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing i18n (0.7.0)
Installing json (1.8.3)
Installing minitest (5.7.0)
Installing thread_safe (0.3.5)
Installing tzinfo (1.2.2)
Installing activesupport (4.2.3)
Installing claide (0.8.2)
Installing fuzzy_match (2.0.4)
Installing nap (0.8.0)
Installing cocoapods-core (0.36.0)
Installing cocoapods-downloader (0.8.1)
Installing cocoapods-plugins (0.4.2)
Installing netrc (0.7.8)
Installing cocoapods-trunk (0.6.1)
Installing cocoapods-try (0.4.5)
Installing colored (1.2)
Installing escape (0.0.4)
Installing molinillo (0.2.3)
Installing open4 (1.3.4)
Installing xcodeproj (0.23.1)
Installing cocoapods (0.36.0)
Using bundler (1.5.1)
Your bundle is complete!
It was installed into ./vendor/bundle

インストールに成功すると、「Your bundle is complete!」のメッセージが表示されます。
プロジェクトのルートにはGemfile.lockというファイルが作成されています。このファイルには、プロジェクトで利用しているパッケージとバージョンの情報が記載されています。

不要ファイルだと勘違いして削除する人がいますが、削除してはいけません。
削除してしまうと、プロジェクトで利用しているパッケージとバージョンの情報がわからなくなってしまいます。
git等のソース管理ツールできちんと管理しましょう。

Podfileの記載とパッケージのインストール


【terminal】

// Podfileを作成
touch Podfile

プロジェクト配下にPodfileを作成します。
上記で作成したPodfileはswiftアプリで使うパッケージのインストールに使用します。

【almo-swift/Podfile】

platform :ios, '8.0'
use_frameworks!

pod 'Alamofire', '~> 1.2'
pod 'SwiftyJSON', '~> 2.2.0'

上記ではネットワーク接続に利用するAlamofireと手軽にjsonを扱うSwiftyJSONのパッケージを指定しています。
iosのバージョンはios8を指定します。今回利用するSwiftyJSONパッケージは、ios7に対応する場合は、CocoaPodsで利用することはできないので気をつけてください。

また、SwiftyJSONをCocoaPodsで利用するには、CocoaPods versionが0.36以上である必要があることも留意してください。

【terminal】

bundle exec pod install

Analyzing dependencies

CocoaPods 0.38.0.beta.1 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Downloading dependencies
Installing Alamofire (1.2.3)
Installing SwiftyJSON (2.2.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `almo-swift.xcworkspace` for this project from now on.

パッケージの導入に成功したら、画面からプロジェクトフォルダに移動します。

{project-name}.xcworkspaceファイルをクリックします。

Xcodeが立ち上がり、作成したプロジェクトのPodsフォルダ以下にインストールしたパッケージが確認できます。
確認を終えたら、続けてソースコードをビルドします。

メニュー → ProductBuildを選択します。

インストールに成功していれば、コンパイルが成功します。iphoneシュミレーターを立ち上げて確認みましょう。

アプリが立ち上がり画面が表示されました。はこのプロジェクトでAlamofireを利用していきます。

以上です。

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

関連記事

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月14日火曜日

SwiftでOpenCVを使う その2 ViewControllerに画像とボタンのシンプルな画面を作成する

  • 公開日:2015年07月14日

記事概要


SwiftでOpenCVの使い方を学習します。
その1の続きの記事になります。

開発環境

  • Xcode 6.4
  • Swift 1.2

難易度


★★★★☆(中級)

プロジェクトのひな形の作成


まずはOpenCVの動作を確認するのに必要な画面から作成していきます。
画像とボタンだけのシンプルな画面を作成します。

1. Main.storyboardを選択します。

2. UIImageViewをView Controllerにドラッグします。

3. ButtonをView Controllerにドラッグします。

4. コントローラーにUIImageViewとButtonの@IBOutletを関連づけます。
キーボードのshiftボタンとマウスドラッグでViewControllerにオブジェクトを関連づけます。

Asset Catalogで画像管理


UIImageViewに表示する画像はAsset Catalogで管理します。
Asset Catalogを使うことで、画像を一元管理出来るようになり、画像ファイルの追加・削除・修正を行ってもプロジェクトファイル(.pbxproj)は変更されなくなり、バージョン管理が楽になります。

*以前の記事に説明があります。参考にどうぞ。

1. まず、3つのサイズの画像を用意します。

2. Images.xcassestsを選択し、右クリックでNew Image Setを選択します。

3. sampleと命名し、1x, 2x, 3xに画像をドラッグします。

各サイズは以下の端末が対応になります。

  • iPhone 6 Plus (@3x)
  • iPhone 6 and iPhone 5 (@2x)
  • iPhone 4s (@2x)
  • iPad and iPad mini (@2x)
  • iPad 2 and iPad mini (@1x)

4. Asset Catalogで管理している画像をUIImageViewに表示できるように以下のように実装します。

【swift】

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var arrange: UIButton!
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sampleImg = UIImage(named:"sample");
        imageView.image = sampleImg;
        
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

Images.xcassestsのsampleをimageViewに設定しているだけです。
ビルドして画面を立ち上げて確認します。

画面が確認できました。続いて、ボタン処理を記述します。

UIButtonでクリック処理


【swift】

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var arrange: UIButton!
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sampleImg = UIImage(named:"sample");
        imageView.image = sampleImg;
        
        arrange.addTarget(self, action: "onClickArrangeBtn:", forControlEvents:.TouchUpInside);
        
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // click arrange button
    internal func onClickArrangeBtn(sender: UIButton) {
        println("click");
    }


}

ボタンクリックの処理を追加しただけです。ボタンをクリックすると、ログに以下のように出力されます。

これでOpenCVを使う準備が整いました。
次回はswiftを使ってOpenCVを動かしていきます。
…といきたいところだったのですが、swiftではうまくopenCVのコンパイルを通すことができませんでした。
原因は多分cocoapodsです。バージョンの問題だと思うのですが…。
今は原因をゆっくり調査する時間がないので、まずはObjective-Cで実装することにしました。
また時間があるときに挑戦して続きを記載したいと思います。(もしくはcocoapodsなしで利用)
なので、次はObjective-CでのOpenCVの使い方の説明になってしまいます。すいません。
でわ。

ps: なかなかObjective-Cからswiftに移行できません。オープンソース化でもう少し使いやすくなると実際に利用できるかもしれません。

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

OpenCvでの開発にオススメの本


OpenCVはこの本一択です。長く利用できるコストパフィーマンスに優れた良書です。
あとは公式サイト(とgoogle検索と試行錯誤)で大丈夫です。

参考サイト

関連記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年7月12日日曜日

SwiftでOpenCVを使う その1 cocoapodsでOpenCVをインストールする

  • 公開日:2015年07月12日

記事概要


SwiftでOpenCVの使い方を学習します。

開発環境

  • Xcode 6.4
  • Swift 1.2

難易度


★★★★☆(中級)

プロジェクトのひな形の作成


まず最初にiphoneプロジェクトのひな形から作成していきます。
xcodeを立ち上げて、プロジェクトを作成します。

iOS → ApplicationSingle View Applicationを選択します。

  • Product Nameにopencv-swiftと入力
  • Organization Nameに組織名称(ここではcom.masa)と入力
  • Organization Identifierに組織名称(ここではcom.masa)と入力
  • LangugageSwiftを選択
  • Deviceiphoneを選択
  • Use Core Dataのチェックボックスを外す

プロジェクトフォルダを選択すると、上記のようにプロジェクトが作成されます。
次は、iphoneアプリプロジェクトのパッケージ管理にcocoapodsを導入します。
cocoapodsは開発に便利なパッケージの導入や管理をしてくれるツールです。

OpenCVもcocoapodsで取得することができます。
では、xcodeを閉じましょう。
macのターミナルを開いて、上記で作成したプロジェクトフォルダまで移動します。

【terminal】

// プロジェクトフォルダに移動
cd /Users/{username}/Documents/iworksample/opencv-swift/

// Gemfileを作成
touch Gemfile

プロジェクト配下にGemfileを作成します。
ここで作成したGemfileはcocoapodsのインストールに使用します。
GemfileはBundler用の設定ファイルです。Bundlerはgemのバージョン管理を行うプログラムです。
この辺の知識や技術はRubyの開発の経験があると理解しやすいのですが、cocoapodsの導入だけでRubyの学習をする必要はありません。わからなくても手順通り作業を進めて問題ありません。

また、cocoapodsの導入にはRubyが必要なので、Rubyが未インストールの人は、最初にRubyをインストールしておく必要があります。(この記事ではRubyがインストール出来ている前提で話を進めます)
*この記事でのrubyはversion2.2.2を使用しています。

Gemfileの記載とCocoaPodsのインストール


次にGemfileを使ってcocoaPodsをインストールします。
Gemfileは、以下のように記載します。

【Gemfile】

source 'https://rubygems.org'
gem 'cocoapods', '0.36.0'

上記のGemfileを保存します。
cocoapodsのバージョンは0.36.0を利用します。
cocoapodsのバージョンは、プロジェクトの全員が同じバージョンを利用するようにします。

次にRubyを使ってcocoapodsをインストールします。
この記事では、bundler(RubyのGemパッケージの管理)を使用しているので、bundle installコマンドを使います。

【terminal】

bundle install --path=vendor/bundle

Fetching gem metadata from https://rubygems.org/...........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing i18n (0.7.0)
Installing json (1.8.3)
Installing minitest (5.7.0)
Installing thread_safe (0.3.5)
Installing tzinfo (1.2.2)
Installing activesupport (4.2.3)
Installing claide (0.8.2)
Installing fuzzy_match (2.0.4)
Installing nap (0.8.0)
Installing cocoapods-core (0.36.0)
Installing cocoapods-downloader (0.8.1)
Installing cocoapods-plugins (0.4.2)
Installing netrc (0.7.8)
Installing cocoapods-trunk (0.6.1)
Installing cocoapods-try (0.4.5)
Installing colored (1.2)
Installing escape (0.0.4)
Installing molinillo (0.2.3)
Installing open4 (1.3.4)
Installing xcodeproj (0.23.1)
Installing cocoapods (0.36.0)
Using bundler (1.5.1)
Your bundle is complete!
It was installed into ./vendor/bundle

インストールに成功すると、「Your bundle is complete!」のメッセージが表示されます。
プロジェクトのルートには『Gemfile.lock』というファイルが作成されています。
このファイルには、プロジェクトで利用しているパッケージとバージョンの情報が記載されます。

ネット上の情報の中には、このGemfile.lockを不要なファイルと勘違いして削除を促している人がいますが、削除してはいけません。削除してしまうと、プロジェクトで利用しているパッケージとバージョンの情報がわからなくなってしまいます。
『Gemfile.lock』は、git等のソース管理ツールできちんと管理してください。

Podfileの記載とパッケージのインストール

【terminal】

// Podfileを作成
touch Podfile

プロジェクト配下にPodfileを作成します。
上記で作成したPodfileはswiftアプリで使うパッケージのインストールに使用します。

【Podfile】

source 'https://github.com/Zi0P4tch0/Specs.git'

platform :ios, '7.0'

pod 'OpenCV', '2.4.9-zp'

iosのバージョンはios7を指定します。

【terminal】

bundle exec pod install

Analyzing dependencies
Downloading dependencies
Installing OpenCV (2.4.9-zp)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `opencv-swift.xcworkspace` for this project from now on.

パッケージの導入に成功したら、Xcodeを閉じます。
次に、GUI画面からプロジェクトフォルダに移動します。

{project-name}.xcworkspaceファイルをクリックします。

Xcodeが立ち上がり、作成したプロジェクトのPodsフォルダ以下にインストールしたパッケージが確認できます。
確認を終えたら、続けてソースコードをビルドします。

メニュー → ProductBuildを選択します。

コンパイルに成功したら、iphoneシュミレーターを立ち上げて画面を確認します。

アプリが立ち上がり画面が表示されました。次はこの準備したプロジェクトでOpenCVを使用していきたいと思います。

Swiftでのiphoneアプリ開発にオススメの本


詳細swiftよりこちらの本をオススメします。
objective-cの経験がある人や、初心者から中級者までの開発者はこの本のほうが役に立ちます。
ただし、swiftはバージョンアップの速度が早いので、購入するときは自分が利用しているswiftのバージョンでも役に立つことを確認してから購入するように注意してください。

OpenCvでの開発にオススメの本


OpenCVはこの本一択です。長く利用できるコストパフィーマンスに優れた良書です。
あとは公式サイト(とgoogle検索と試行錯誤)で大丈夫です。

参考サイト

関連記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年2月1日日曜日

swift Alamofireを使う 詳細編

今回はAlamofireを使ってAPIからデータを取得するコードを詳細に実装していきます。
Alamofireの導入方法はここに記載済みです。

環境

  • Xcode Version 6.1 (6A1052d)

AlamofireでAPIデータ取得

以下は公式サイトの例を元に作成したコード


        Alamofire.request(.GET, "http://test/api/v1/tests", parameters: ["offset": 0, "limit": 1, "test_id": 1])
            .responseJSON { (request, response, JSON, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    println(JSON)
                } else {
                    // error
                    println(error)
                }
        }

上記の処理に例外処理を追加したのが以下の処理になります


    /**
    APIXXXXに接続する.
    
    */
    func connect() {
        
        Alamofire.request(.GET, "http://test/api/v1/tests", parameters: ["offset": 0, "limit": 1, "test_id": 1])
            .responseJSON { (request, response, data, error) in

                if (response?.statusCode == 200) {
                    println("success")
                    let json = SwiftyJSON.JSON(data!)
                    println(json)
                    return;
                }

                self.showAlertView(response)

        }

    }

    /**
    AlertViewを表示.
    
    :response: HTTPレスポンス.
    
    */
    func showAlertView(response :NSHTTPURLResponse?) {
        
        // 定数
        var const = Const()
        // API共通処理
        var apiCommon = APICommon()
        var alert = UIAlertView()
        
        // Optional型の変数が値をもっていた場合(responseが返ってきた場合)の処理
        if (response != nil) {
            println("is response")
            alert.title = apiCommon.getAlertTitle(response!.statusCode)
            alert.message = apiCommon.getAlertMessage(response!.statusCode)
        // Optional型の変数が値をもっていない場合(responseが返ってこない場合)の処理
        } else {
            println("no response")
            alert.title = apiCommon.getAlertTitle(0)
            alert.message = apiCommon.getAlertMessage(0)
        }
        
        alert.addButtonWithTitle("OK")
        alert.show()
    }


変更後のコードの説明

Alamofireの結果のresponseはoptional value宣言で実装されています。そのため、
!を付けた場合は変数の中身がnilだと実行時にエラーになり、?を付けた場合は変数の中身がnilだとエラーにはなりません

responseの中身がnilの場合というのはサーバーが落ちている場合です。
上記の例では、nil(サーバーが落ちている)の場合は、UIAlertViewでサーバーが利用できない旨の表示をする実装をしています。

nil以外(レスポンスはあるが200以外のステータスコードが返ってくる)の場合は、共通クラスでステータスコードに応じたタイトルとメッセージを取得してUIAlertView画面を表示しています。

swiftで実装する場合、optional valueかどうかを意識することがかなり重要になります。というのは、!を付けた場合は変数の中身がnilだと実行時にエラーになります。つまり、実際にアプリを動かしてからエラーが発生します。
プログラミングは習うより慣れろなので、swiftを実装する際は、いつも通りのコーディングパターンに落としこむのでなく、色々なパターンを試してみると良いでしょう。

以上

追伸 : swiftのプログラムコメントはここを参考にしています。

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月28日水曜日

swift AppDelegateでUse of undeclared typeエラー

swiftでcore dataを実装しようとしたらUse of undeclared type 'AppDelegate'が発生。
発生したことのないエラーだったので対処方法を記録。

環境

  • Xcode6.1

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

上記のコードを記載したときに『Use of undeclared type 'AppDelegate'』のエラーが発生しました。原因はAppDelegate.swiftがTarget MembershipのTestに含まれていなかったのが原因です。

なので、解決方法は、

  • AppDelegate.swiftファイルを右クリック
  • Target Membershipの{ProjectName}Testsにチェックを入れる
  • Build

上記の手順でコンパイルが通ると思います。

以上

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月23日金曜日

スマホアプリ開発のための復習 Observerパターン by swift

Observerパターンとは?

状態の変化を観察することを目的としたパターンです。

ここ数年、色々なandroidとiphoneの開発(ネイティブアプリ)を手がけましたが、スマホアプリ開発でもっとも利用頻度の高いデザインパターンがObserverパターンだと思います。 webアプリの時はabstract factoryやTemplate Methodをよく利用していましたが、スマホアプリだとObserver, Stateあたりも負けじとよく利用します。

そんなわけで、まずはswiftでObserverパターンの学習です。

環境

  • Xcode6.1

Observerパターンのサンプル


class StepCounter {
    
    var totalSteps: Int = 0
    
    var inputValue: Int = 0 {
        
        willSet {
            totalSteps = totalSteps + newValue
        } didSet {
            // 合計が150を超えたら前回の入力値に戻して、入力値も0に戻す
            if (totalSteps > 150) {
                totalSteps = oldValue
                inputValue = 0
            }
            //println(oldValue)
            //println("didSet")
            //totalSteps = oldValue
        }
    }
}

let stepCounter = StepCounter()

stepCounter.inputValue = 100
stepCounter.totalSteps // 100

stepCounter.inputValue = 40
stepCounter.totalSteps // 140
stepCounter.inputValue // 40

stepCounter.inputValue = 20
// 150を超えたので、前回の40に戻る
stepCounter.totalSteps // 40
// 入力値が0に戻っている
stepCounter.inputValue // 0

ポイントは以下

  • willSetのあとにdidSetが呼び出される
  • willSetはデフォルトでnewValue, didSetはデフォルトでoldValueという変数が利用できる
  • プロパティ(この例ならinputValue)には、willSetからはアクセスできない

実際にはmodelで使うケースが多くなりそうです。今後、積極的に使っていこうと思います。実際に利用した時、また詳しく記述します。

以上

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月22日木曜日

swift DebugとReleaseでAPIのURLを分ける

ビルドをするときに、DebugとReleaseでAPIのURLを分けるやり方のメモ

環境

  • Xcode6.1

定数クラスを作成

定数クラスConstを作成します。APIのURLやSNSのURLなどの、環境ごとの振り分けを記述します。


class Const {
    
    /* API URLs */
    #if DEBUG
    let URL_API = "http://debug.hoge.com/api"
    #else
    let URL_API = "http://production.hoge.com/api"
    #endif
    
}

Swift Compiler - Custom Flagsの設定

BuildSettingsパネルのSwift CompilerのOther Swift FlagsのDebugに-D DEBUGを設定します。

上記の定数を呼び出すコードを記載します。


println(Const().URL_API)

ビルドしてアプリを立ち上げて、debug consoleを確認します。


http://debug.hoge.com/api

#if DEBUG内の定数が呼ばれていますね。続けてReleaseの値を出すため、Debugに-D RELEASEを設定します。

ビルドしてアプリを立ち上げて、debug consoleを確認します。


        http://production.hoge.com/api

うまくいきましたね。

APIのURL切り替えはアプリ作成時にはよく使う手法だと思います。swiftでのネットワーク接続はAlamofireを利用すると便利です。ご利用するかたは、こちらの記事を参考ください。

以上。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

swift SwiftyJSONではまった件

swiftでjsonを扱うときは、SwiftyJSONというライブラリを利用するのが一般的です。
ところがこのライブラリでどはまりしました。というわけでメモ

環境

  • Xcode Version 6.1 (6A1052d)

SwiftyJSONを取得

CocoaPodsでswiftが利用できるのはCocoaPods 0.36からです。私の環境ではまだ0.35なのでgit submoduleで取得します。


// プロジェクトフォルダへ移動
cd /Users/{username}/Documents/swiftworkspace/{projectFolder}

// サブモジュールとして取得する
git submodule add https://github.com/SwiftyJSON/SwiftyJSON.git

// SwiftyJSONディレクトリを開く
// SwiftyJSON.xcodeprojをproject treeに移動させる
// ビルド
// Target DependenciesでswiftyJSONを選択


以上で準備完了です。画像を以下に貼り付けておきます。

Alamofireで取得したjsonを取得するサンプルコード(間違い)


        import UIKit
        import Alamofire
        import SwiftyJson

        Alamofire.request(.GET, "http://test.com/api/v1/math", parameters: ["offset": 0, "limit": 1, "student_id": 1])
            .responseJSON { (request, response, data, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    let json = JSON(data!)
                    println(json)
                } else {
                    // error
                    println(error)
                }
        }

上記のコードを書くとコンパイルは通ります。しかし、シュミレーターを起動すると、swiftyjson linker command failedエラーで動かなくなります。
正しい実装は以下の通り。

Alamofireで取得したjsonを取得するサンプルコード(正しい)


        import UIKit
        import Alamofire
        import SwiftyJson

        Alamofire.request(.GET, "http://test.com/api/v1/math", parameters: ["offset": 0, "limit": 1, "student_id": 1])
            .responseJSON { (request, response, data, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    let json = SwiftyJSON.JSON(data!)
                    println(json)
                } else {
                    // error
                    println(error)
                }
        }

JSONをSwiftyJSON.JSONに変更するときちんと動作します。
これだけのことなのに、すごくはまってしまいました。

以上

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月16日金曜日

swift TIPS

一回一回検索して調査するのが面倒なので、よく利用する処理のメモ

環境

  • Xcode6.1

UINavigationControllerに設定したUIViewControllerの操作

1.ナビゲーションバーを非表示


        self.navigationController!.setNavigationBarHidden(true, animated: false)

2.背景色の設定


        self.view.backgroundColor = UIColor.blackColor()

ボタンを画像にする


        // カスタム
        var button = UIButton.buttonWithType(.Custom) as UIButton
        button.frame = CGRectMake(20, 250, self.view.bounds.width - 40, 150);
        button.enabled = true
        // 画像の指定
        button.setImage(UIImage(named: "test"), forState: .Normal)
        // actionの指定
        button.addTarget(self, action: "test", forControlEvents: UIControlEvents.TouchUpInside)

以上。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

swift swiftからobjective-cのコードを呼び出す

swiftからobjective-cを呼び出す必要があったので、やり方をメモ

環境

  • Xcode6.1

まずはobjective-cのコードを用意します。以下が手順。

  • New FileでObjective-cファイルを選択して作成する
  • {@tagetname}-Bridging-Header.hと{@tagetname}Tests-Bridging-Header.hの二種類のファイルも自動作成するよう選択する
  • Build Settings Swift CompilerのObjective-c Bridge Headerに上記のファイルが設定されていることを確認する

以下、サンプルです。

hファイル


#import 

#ifndef Test_ObjectiveCManager_h
#define Test_ObjectiveCManager_h

#endif

@interface ObjectiveCManager : NSObject

/**
 Returns a string.
 */
- (NSString *)ObjectiveCManagerString;

@end

mファイル


#import "ObjectiveCManager.h"

#import <Foundation/Foundation.h>

@implementation ObjectiveCManager

- (NSString *)ObjectiveCManagerString {
    return @"hello objective-c";
}

@end

{@tagetname}-Bridging-Header.hファイルと{@tagetname}Tests-Bridging-Header.hファイル。両ファイルに記述しないとビルドが通らないことに注意


#import "QRBarcodeManager.h"

上記のビルドが上手くできれば、swift側でクラスを呼び出してあげればOK。swift側にimportは不要です。


        var objcObj = ObjectiveCManager()
        var msg = objcObj.ObjectiveCManagerString();
        
        println(msg)

以上。便利ですね。でもちょっと気持ち悪いw

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月15日木曜日

swift コードでUITabBarController

コードでUITabBarControllerを実装する方法のメモ

環境

  • Xcode6.1

objective-cと基本的なやり方は変わりません。tabごとのviewを作成して、UITabBarControllerを継承したTabBarControllerに設定するだけです。


class MainTabBarController: UITabBarController {
    
    var homeViewController: HomeViewController!
    var infoViewController: InfoViewController!
    var itemViewController: ItemViewController!
    var otherViewController: OtherViewController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        homeViewController = HomeViewController()
        infoViewController = InfoViewController()
        magazineViewController = MagazineViewController()
        otherViewController = OtherViewController()
        
        //表示するtabItemを指定
        homeViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.Featured, tag: 1)
        infoViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.Bookmarks, tag: 2)
        magazineViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.Bookmarks, tag: 3)
        otherViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.Featured, tag: 4)
        
        // タブで表示するViewControllerを配列に格納します。
        let myTabs = NSArray(objects: homeViewController!, infoViewController!, magazineViewController!, otherViewController!)
        
        // 配列をTabにセットします。
        self.setViewControllers(myTabs, animated: false)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}


以上。つーか、objective-Cと同じですね。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

swift 画面遷移でWHOSE VIEW IS NOT IN THE WINDOW HIERARCHY!発生

swiftで画面遷移を実装したら発生しました。

環境

  • Xcode6.1

原因は、viewDidLoad()関数内でpresentViewController()関数を呼び出して画面遷移を実装したためです。
画面遷移の処理をviewDidLoad()関数でなく、viewDidAppear()関数内で呼び出すようにしたらうまくいきました。
以下にサンプルを記載します。


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.configureUI()
        // ここで呼び出すとWHOSE VIEW IS NOT IN THE WINDOW HIERARCHY!が発生する
        //self.mvHomeView()
    }
    
    override func viewDidAppear(animated: Bool) {
        self.mvHomeView()
    }

    // Home画面に遷移
    func mvHomeView() {
        println("go HomeView")
        let homeViewController: UIViewController =  HomeViewController()
        self.presentViewController(homeViewController, animated: true, completion: nil)
    }

以上。つーか、objective-Cと同じですね。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年1月11日日曜日

SwiftでAsset Catalog

Asset Catalog は、画像リソースの管理に利用します。
Asset Catalog を使うことで、画像を一元管理出来るようになり、画像ファイルの追加・削除・修正を行ってもプロジェクトファイル(.pbxproj)は変更されないためバージョン管理が楽になります。

環境

  • Xcode Version 6.1 (6A1052d)

Asset Catalog は swift でも利用可能です。以下、手順です。

  1. xcodeでプロジェクトを立ち上げる。
  2. images.xcassetsをクリック。
  3. 右クリックで「New Image Set」を選択。
  4. 1x, 2x, 3xの位置に、対象の画像をマウスでドラッグして配置する。
  5. ビルドを実施する。
  6. 画像名.imagesフォルダの下にContents.jsonが存在していれば成功。

せっかくですので、UIViewControllerの背景にAsset Catalogの画像を利用してみましょう。


    override func viewDidLoad() {
        super.viewDidLoad()
        setBackGroundImage()
        self.configureView()
    }

    // 背景を設定する
    func setBackGroundImage() {
        
        let myImage = UIImage(named: "splash")
        var myImageView = UIImageView()
        myImageView.image = myImage
        myImageView.frame = CGRectMake(0, 0, myImage!.size.width, myImage!.size.height)
        self.view.addSubview(myImageView)
        
    }

上記の処理を記載してビルドすると、画像が背景に設定されます。 UIImageから画像サイズを取得するのに、Forced Unwrappingを利用しているのがポイントですね。あとはobjective-cの時と変化ありません。

以上

参照

山情報&登山SNSアプリ「マウンテンチャンネル」を公開しました。

マウンテンチャンネル公式サイト

Android app on Google Play

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年12月17日水曜日

swift基礎 Alamofireでhttp接続

swiftの基礎まとめ。
HTTP接続でAPIからデータ取得する実装です。Alamofireライブラリを利用してみます。

環境

  • Xcode Version 6.1 (6A1052d)

AlamofireのDL

CocoaPodsで管理できないので、gitで直接取得します。


// プロジェクトフォルダへ移動
cd /Users/{username}/Documents/swiftworkspace/projectfolder

// サブモジュールとして取得する
git submodule add https://github.com/Alamofire/Alamofire.git

// xcode6.1でLink Binary With Libraries機能を利用して、Alamofire.frameworkを追加する。

上記の手順を踏むと、Libraryとして利用できるようになるので、公式サイトに説明されている通りに実装します。


import Alamofire

        Alamofire.request(.GET, "http://test/api/v1/tests", parameters: ["offset": 0, "limit": 1, "test_id": 1])
            .responseJSON { (request, response, JSON, error) in
                if (response?.statusCode == 200) {
                    println("success")
                    println(JSON)
                } else {
                    // error
                    println(error)
                }
        }

上記のように記述することで、APIを使ってjsonを取得することができます。

jsonのパースはSwiftyJSONが一般的なようです。SwiftyJSONの導入方法と使い方はまた別記事で。
以上

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年12月13日土曜日

swift基礎 storyboardなしでTableViewを実装

swiftの基礎まとめシリーズ。
アプリ作成には避けて通れないTableViewの使い方です。

環境

  • Xcode Version 6.1 (6A1052d)

tableviewの実装

前回と同じように、storyboardを使わない実装方法です。
といってもobjective-c版とほとんど変化はありません。


import UIKit

class TestsViewController: UITableViewController {
    
    // tableviewで表示する配列
    var tests = [Test]()
    
    // testdata load
    func test() {
        // Do any additional setup after loading the view, typically from a nib.
        // self.navigationItem.leftBarButtonItem = self.editButtonItem()
        
        //let addButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "insertNewObject:")
        //self.navigationItem.rightBarButtonItem = addButton
        
        if tests.isEmpty {
            println("empty");
        } else {
            println("not empty");
        }
        
        var obj = Test(id: 1, testCode: "001", testName: "英語", imagePath: "asasa")
        tests.append(obj)
        
        var obj2 = Test(id: 2, testCode: "002", testName: "数学", imagePath: "asasa")
        tests.append(obj2)

        
        if tests.isEmpty {
            println("empty");
        } else {
            println(tests.count);
        }
        
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.test()
        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier:"testcell")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tests.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier:"testcell")
        let test = tests[indexPath.row] as Country
        
        cell.textLabel.text = test.testName
        return cell;
    }
    
    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }
    
    
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let test = tests[indexPath.row]
        let resultViewController = ResultViewController()
        navigationController!.pushViewController(resultViewController, animated: true)
        
    }
    
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            //objects.removeObjectAtIndex(indexPath.row)
            //tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        } else if editingStyle == .Insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
        }
    }

}


objective-cのテーブルviewより随分とスッキリした短いコードになっています。
一番のポイントは tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier:"testcell") です。
storyboardを使わない場合は、表示に利用するcellをviewDidLoadメソッドで登録しておく必要があります。カスタムセルを利用する場合も同様です。

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年12月10日水曜日

swift基礎 storyBoardを利用しない画面遷移

swiftの基礎まとめ。
storyBoardを利用しないで画面遷移を実装する方法です。

環境

  • Xcode Version 6.1

最初のページへの画面遷移を作成する

AppDelegate.swiftに処理を記載します。 よくありがちなパターンとして、splash画面に遷移させます。splash画面は、SplashViewControllerというクラスにします。


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow!

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window.backgroundColor = UIColor.whiteColor()
        window.rootViewController = UINavigationController(rootViewController: SplashViewController())
        window.makeKeyAndVisible()
        return true
    }

}

windowオブジェクトをForced Unwrappingで宣言しています。
Optional Chainingでも実装可能ですが、エラーはコンパイルでつぶす方向が良いと思います。まあ、好みなのでどちらでも良いと思います。

次のページへの画面遷移を作成する

slash画面では、こにょごにょ処理をやって初期化とかデータを取得したらログイン画面に遷移するのもよくありがちなパターンですね。以下のような感じです。


class SplashViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // something doing
        self.mvLoginView()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func mvLoginView() {
        println("go loginView")
        let loginViewController = LoginViewController()
        navigationController!.pushViewController(loginViewController, animated: true)
    }
    
}

そのまんまの処理です。
mvLoginView関数を呼び出して次のログイン画面に遷移させています。letは定数宣言。直接実体化してもこのサンプルなら問題なし。
navigationControllerは、Forced UnwrappingでpushViewControllerを呼び出します。ここもOptional Chainingでも動きます。

printlnはデバッグ用の関数です。
swiftではデバッグにNSLogではなく、printlnが推奨されています。
NSLogより10倍くらい速いらしいです。

とりあえず画面遷移はこんな感じで記載していくとよいでしょう。swiftは本当にコード量が少なくてスッキリ書けますね。

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...