2014年05月13日

IBで作ったカスタム・ビューをStoryboardで再利用する

xcode5 Interface builder(以下IB) で、xibファイルとして作成したカスタム・ビューをStoryboardに配置してIB内で再利用する方法を紹介します。Storyboadの変わりに別のxibファイルを使っても同様の結果です。

0. 準備


xcode で新規アプリケーション・プロジェクトを「Simple View Application」テンプレートを選択して作成してください。ここでは[Product Name]をCVSampleとして作成します。

1. カスタム・ビューの作成


最初にカスタム・コントロールを作成します。

Step1> xibファイルの作成


xcode プロジェクトの左ペイン、[Project Navigator] の [CVSample] グループを右クリック、[New File…]を選択します。[iOS] → [User Interface] → [View]を選択して、[Next] ボタンをクリック。[Device Family] を[iPhone]にして[Next]ボタンをクリック。[Save As]を「CustomView」として[Create]ボタンをクリックし、CustomView.xib ファイルを作成します。

Step2> IBでカスタム・ビューをレイアウト


CustomView.xib をIB エディターで開き、右パネル[Attribute Inspector]の[Simulated Metrics]>[Size]を「Freeform」、[Orientation]を「Portrait」、[Status Bar][Top Bar][Bottom Bar]を「None」に設定し、Viewを希望のサイズにドラッグします。(図1)
Object Library からUIコントロールを選択してViewに配置します。(ここでは例として、Segmented Controlとラベル)。

CustomView0.png
図1カスタム・ビューのレイアウト

Step3> CustomViewクラスを作成


[Project Navigator]から「CustomView.xib」を右クリック、メニューの[New File…]を選択し、[iOS]>[Cocoa Touch]から[Objective-C class]を選択し、[Next]ボタンをクリック。[Sub class of]を「UIView」にして、[Class] には.xibと同じ名前「CustomView」を入力、[Next]ボタンをクリックして、クラスファイルのヘッダーと実装ファイルを作成します。

Step4> xibのクラスをCustomViewクラスに設定


CustomView.xibをクリックして、IBのレイアウト・エディターに戻り、[Identity Inspector]の[Custom Class]>[Class]を「CustomView」に設定します。(図2)

CustomView1.png
図2 xibのクラスを設定

2. Storyboardにカスタム・ビューを配置


[Project Navigator]から[CustomView.xib]を選択し、IBを表示します。[Object Library]から「View」を任意の位置にドラッグし、カスタム・ビューがそこに収まるようにリサイズして配置します。配置したUIView を選択して、[Identity Inspector]の[Custom Class]>[Class]にカスタム・ビュークラス名「CustomView」を入力します。(図3)
CustomView2.png
図3 Storyboardに配置

3. 問題点(課題)の確認


この時点で、シミュレーターで実行してみます。メイン・ビューに配置・設定したはずのカスタム・ビューは表示されず、ブランクのままです。
それもそのはず、CustomView クラスはロードされても、xibファイルをロードしていません。

4. xib ファイルのロード (CustomView.mファイル)


3の課題を解決するには、以下の手順でコードを CustomView.mファイルに追加します。

Step1> サポート・メソッド(スタティック)の追加


xibをロードするコードを記述するスタティック・サポート・メソッド、loadInstanceOfViewFromNibを記述します。ここに標準的こxibファイルをロードするコードを書きます。

Step2> awakeAfterUsingCoder:aDecoder メソッドをオーバーライドする


- (id) awakeAfterUsingCoder:(NSCoder*)aDecoderをオーバーライドします。このメソッドはxibファイルがロードされたときに呼び出されます。厄介なことにStoryboardからロードされたときと、上記のloadInstanceOfViewFromNibメソッドで呼ばれたときにも呼び出されます。そのままでは、無限ループになってしまうので、Storyboardにレイアウトした張りぼてのUIView(プレースホールダー)としてロードされたときを検出して、xibロード時のコールが無限ループになるのを防ぎます。
また、プレイスホールダーとしてのUIViewに指定したプロパティを新しくロードしたCustomViewに受け継ぐ処理が入っています。これは必要なだけ記述してください。以上、このサンプルの追加のコードは以下の通りです。

// サポート・メソッド
+ (CustomView*)loadInstanceOfViewFromNib {
return [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil] lastObject];
}

// オーバーライド
- (id) awakeAfterUsingCoder:(NSCoder*)aDecoder {
BOOL loadedFromSimpleVuew = ([[self subviews] count] == 0);
if (loadedFromSimpleVuew) { // プレース・ホールダーViewの検出
CustomView* customView = [CustomView loadInstanceOfViewFromNib];

// IBでプレース・ホールダーに設定したプロパティをコピー
customView.frame = self.frame;
customView.autoresizingMask = self.autoresizingMask;
customView.alpha = self.alpha;
customView.userInteractionEnabled = self.userInteractionEnabled;
// ... その他、必要なだけのプロパティをコピーする
return customView;
}
return self;
}


以上です。トラップを少し回避するだけで、再利用可能なカスタム・ビューが使えるようになりました。カスタム・ビューに配置したオブジェクトのハンドリング等は、適時、行ってください。

posted by ayagu at 15:05| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする

2014年05月10日

php pdo_mysql のインストールと設定

PHPでWebアプリケーションを構築する場合、何かしらのフレームワークを利用することが多いと思います。
モデルやデータベースの記述をしたときに、突然以下のようなエラーが出る場合は、使用するデータベースのPDOドライバーがインストールされていない、もしくは設定が不足しています。
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in ...


そんな場合の対処方法です。以下は mysql の場合の例です。

エクステンションの確認


共有モジュールががインストールされているかどうかを確認します。
$ php -i | grep extension_dir
extension_dir => /usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212

extension_dirに指令されているディレクトリ(上記の場合は"/usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212")に目的の共有ライブラリが存在するかどうかを確認します。
今回はmysqlなので、"pdo_mysql.so"と"mysqli.so"が存在するかどうかを確認します。

pdo_mysql のインストール


存在しない場合は、以下のようにpeclコマンドでインストールします。
$ sudo pecl install pdo_mysql


pdo_mysql の設定


php.ini の内容を確認してください。以下の2行が存在しない場合、追加します。
extension=mysqli.so
extension=pdo_mysql.so

"php -i" コマンドの表示に以下のような行が含まれていれば設定は有効です。
php -i | grep mysql
...
PDO drivers => sqlite, mysql
pdo_mysql
...

FastCGI マネージャーとかを使っている場合は、サービスを起動し直してください。



ラベル:Install PDO MySQL PHP
posted by ayagu at 09:57| Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。