Taker's iOSアプリ開発調査ログ

iOSアプリ開発に関する調査メモ置き場

StoryboardにNibファイルを読み込む

お題

Storyboardをメインで使用しているが、一部のViewを再利用したい。またはStoryboard上では編集が困難なので管理を別にしてしまいたい。

対応

Storyboard上にカスタムViewを配備し、そのカスタムViewにNibファイルから読み込んだViewをaddSubViewする。

  1. Xibファイルを生成する (例:MyView.xib)
  2. UIViewを継承したクラスを作る(MyView.swift)
  3. MyView.xibのFile's OwnerにMyViewを指定する
  4. MyViewクラスにinit:coderメソッドを定義する
  5. init:coderメソッドでNSBundle:loadNibNamed()でNibファイルをロードする
  6. ロードしたNibファイルをaddSubViewする
  7. StoryBoardにViewを追加し、custom classを作成したカスタムViewにする
//MyView.swift
class MyView: UIView {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let headerView = NSBundle.mainBundle().loadNibNamed("MyView", owner: self, options: nil)[0] as UIView;
        self.addSubview(headerView)
    }
}

補足

  • UITableViewのヘッダー、フッターのビュー設定などにも使える
  • StoryBoard上にXibで定義したUIが表示されるわけではない。

SwiftにObjective-Cのコードをimportする

解説

SwiftからObjective-Cのライブラリを利用するにはヘッダーファイルを1つ用意し、そこに利用したいライブラリをimportする。それだけでSwiftのコード側には一切import文を記述することなく利用できるようになる。

手順

  1. フレームワークを追加
  2. ヘッダーファイルを作成
  3. Build Settingを編集
  4. ヘッダーファイルを編集
  5. 注意ポイント

1. フレームワークを追加

省略

2. ヘッダーファイルを作成

File > New > File > (iOS or OS X) > Source > Header File. を選択 名前はBridging-Header.hなどとする。

3. Build Settingを編集

Defines Module

Packaging > Defines Module > Yesに設定

f:id:takeR:20141202222255p:plain

Objective-C Bridging Header

Swift Compiler - Code Generation > Objective-C Bridging Hader > Bridging-Header.h に設定

f:id:takeR:20141202222238p:plain

4. ヘッダーファイルを編集

#ifndef SampleApp_Building_Header_h
#define SampleApp_Building_Header_h

#import <FacebookSDK/FacebookSDK.h>

#endif

5. 注意ポイント

Objective-C Bridging Haderをプロジェクトの欄に記述してしまうと

f:id:takeR:20141202222244p:plain

XCode6.2ではビルドエラーになる。

FacebookSDK/FacebookSDK.h file not found

f:id:takeR:20141202223455p:plain

Targetsの方に記述する必要がある。

f:id:takeR:20141202222238p:plain

参考

Using Swift with Cocoa and Objective-C: Swift and Objective-C in the Same Project

[Swift 1.1] とりあえずFacebookログインをしてみる (Xcode 6.1) - Qiita