2011年7月16日土曜日

NSNumber

NSDictionaryやNSArrayで数字やBOOLを扱う場合、NSNumberを使用します。

BOOL型の変数からNSNumberオブジェクトを作りたい - initWithBool:
int型の整数からNSNumberオブジェクトを作りたい - initWithInt:
float型の変数からNSNumberオブジェクトを作りたい - initWithFloat:
double型の変数からNSNumberオブジェクトを作りたい - initWithDouble:

(注)一時的なオブジェクト生成の場合、[Number numberWith... : ...]; とする。

NSNumberオブジェクトからBOOL型の変数を作りたい - boolValue:
NSNumberオブジェクトからint型の整数を作りたい - intValue:
NSNumberオブジェクトからfloat型の変数を作りたい - floatValue:
NSNumberオブジェクトからdouble型の変数を作りたい - doubleValue:
NSNumberオブジェクトをNSString(文字列)に変換したい - stringValue;
NSNumberオブジェクト内の値が他のNSNumberオブジェクトと同じか知りたい - isEqualToNumber:

詳細はこちらに記載があります。
http://konton.ninpou.jp/program/cocoa/dataobject/nsnumber.html


2011年6月30日木曜日

テーブルのセルの高さを変える。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// Return height the height of cell(Row)
return 35.0;
}

テーブルのセクションタイトルの文字色を変更する。

テーブル(UITableView)のセクションタイトルは、以下の記述ではデフォルトの文字色から変更することはできません。


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"E-mail";
}
else if (section == 2){
return @"Sound";
}
else {
return @"Value Added Tax (VAT)";
}
}

そこで以下の記述とすると、セクションタイトルにビューを返すことができ、背景を黒とし、文字の色を白くすることができます。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
if (section == 0) {
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor blackColor];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 30.0f)];
UIImage *bgImage = [UIImage imageNamed:@"topTableSectionTitleBack.png"];
lbl.backgroundColor = [UIColor colorWithPatternImage: bgImage];
lbl.textColor = [UIColor whiteColor];
lbl.text = @" E-mail";
[v addSubview:lbl];
[lbl release];
return v;
}
else if (section == 2){
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor blackColor];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 30.0f)];
UIImage *bgImage = [UIImage imageNamed:@"topTableSectionTitleBack.png"];
lbl.backgroundColor = [UIColor colorWithPatternImage: bgImage];
lbl.textColor = [UIColor whiteColor];
lbl.text = @" Sound";
[v addSubview:lbl];
[lbl release];
return v;
}
else {
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor blackColor];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 30.0f)];
UIImage *bgImage = [UIImage imageNamed:@"topTableSectionTitleBack.png"];
lbl.backgroundColor = [UIColor colorWithPatternImage: bgImage];
lbl.textColor = [UIColor whiteColor];
lbl.text = @" Value Added Tax (VAT)";
[v addSubview:lbl];
[lbl release];
return v;
}
}

しかしながら、このままではセクションのテーブルがタイトル文字と被ってしまいます。そこでテーブルのプロパティにあるHedderのサイズを30とするならば、かぶりを解消することができます。気づくのに結構な時間を費やしてしまった。

2011年6月26日日曜日

UIViewControllerを分割する

UIが複雑になってくるとUIViewControllerが非常に巨大になってきて困っている方も多いのではないでしょうか。
そのような場合には以下の方法があります。
・再利用可能なUIView部品を作成し、コントロールの一部を組み込む。
・UIViewControllerをオブジェクト分割する

再利用可能なUIView部品の作成方法については下記にあるため参考とされたい。ここでのContrntViewは恐らくIBOutletで本体のViewに接続されてたものと思われます。
http://www.awaresoft.jp/development/35-iphone-app/93-create-reusable-ui-with-interface-builder.html

ここでは、後者、すなわち、Nibファイルは一個のままでUIViewControllerを分割する方法を記録します。

−−−*.h−−−−

まず分割したいオブジェクトのヘッダファイルを記述します。

#import
@interface decimalMode : NSObject {
NSString *now;
UIButton *zeroButton, *add2Button , *twoButton, *FButton;

}
@property (nonatomic, retain) NSString *now;
@property (nonatomic, retain) IBOutlet UIButton *zeroButton, *add2Button , *twoButton, *FButton;
-(void) zero ;
-(void) add2 ;
-(void) two ;
-(void) flowting ;
@end

オブジェクト分割時の基本は、オブジェクトの操作をメソッド化(ここではzero- flowting)し、状態の読み取りをプロパティ化することにあります。
そして、操作するUIをアウトレットか化します(ここでは、zeroButton-FButton)。


−−−*.m−−−−


つぎに、実行ファイル(*.m)を記載しますが、ここでの注意点はNibが起動した際に、このオブジェクトを包含して起動してもらうことです。そのために以下のコードを付加します。


-(void) awakeFromNib {
    [super awakeFromNib];
}

あとは普通にzeroからflowtingまでの処理(ここではUIButtonの色操作)を実装します。


−−−*.xib−−−−

次にNibファイルにLibraryからオブジェクトを導入します。
この際、Command+F4でオブジェクトを追加したオブジェクトに変更します。
そうするとIBOutletで指定した足がCommand+F2とかで見ることができると思います。
この足を、マウス右クリック等で、該当するUI部品(この場合はボタン)と連接します。
ーーー*.UIViewController.hーーー

さらにUIViewContrller.hに、当該オブジェクトのヘッダファイルをインポートし、
さらに当該オブジェクトをアウトレット指定します。


#import "decimalMode.h"
@interface makidenViewController : UIViewController{
      ....


decimalMode *DecimalMode;
}

....
@property (nonatomic, retain) IBOutlet decimalMode *DecimalMode;

@end



さらに、InterfaceBuilderに戻り、File's OWnerから実装したオブジェクト(ここではDecimalMode)
に向けて、マウス右クリックしながらのドラックなどで、このアウトレットをオブジェクトとリンクします


ーーー*.UIViewController.m ーーー

お決まりの@synthesizeや=nil, [... release]を実装さえすれば、
オブジェクトが自動でロードされるため、初期化処理なしでいきなり当該オブジェクトを呼び出すことができます。

[DecimalMode zero];


以上です。やったね。

2011年6月22日水曜日

クラスを分割する。

プログラムの機能を増やして行くと、1つのオブジェクト内のコードが膨大となってしまい、メンテナンスがしずらくなります。この解決のためには、やはりオブジェクトとして意味のある単位で分割してまとめるが王道です。

小さく切出す場合は、UIViewの派生オブジェクトとして作るか、ビューコントローラの一部を切出してコントロールするかになるかと思います。しかしながら後者についてはAppleとして推奨しないようです。

実装する際は、これまでグローバル変数などで管理していた状態等を隠蔽しながら実装します。
そのため、状態遷移のためのメソッドを切出したオブジェクトに実装します。
また、呼び出しもとのオブジェクトの状態を確認するためには、プロパティとして状態変数を表に出します。

その結果、ヘッダファイルとしては以下のようなものとなります。


@interface decimalMode : UIView {
NSString *now;
}
// 状態をプロパティ化し、読み出し可能とする ex decimalMode.now
@property (nonatomic, retain) NSString *now;
// 状態を変化させる操作をインスタンス化する。インスタンスの名称には操作の意味を持たせる。
-(void) zero ;
-(void) add2 ;
-(void) two ;
-(void) flowting ;

-(IBAction) decimalPointButtonPressed:(id)sender;
@end

2011年6月16日木曜日

Xcode4でアプリを作る

・ソースコントロール
Window - organizer
左下のタブからAdd
リポジトリを外部のオープンソースから実装できる。<GitHub>


・ソースコードエディタ
 ナビゲーション、エディット、テスト
 右上の左から2番目のボタンでセカンドエディタを開くことができる(*.h、*.m)<Open Counter Part>
    *.mibファイルでは、左にインターフェース、右にソースコードを開くことができる。
 オプションキーを押してクリックすればセカンダリエディタに表示できる。
 ーを入れてCTRL+SPaceでメソッドの候補を出してくれる(Code snippets)。
 右下にある{ }はドラック&ドロップでソースの断片を格納、取り出しでき、繰り返しの入力をサポートしてくれる。
 入力中のバックグラウンドでエラー判定してくれる。黄色いバルーンをクリックしFIXボタンを押すと自動訂正する。

・検索と置換
   サーチナビゲータは、ある範囲での全てのコードを検索してくれる(左上の丸いアイコン)
 正規表現で検索することができる。
 置換はプレビューし、対象を選んでからリプレースすることができる。

・バージョンエディタ(右上、左から三番目)
 ログモード、ブレームモード(誰が)、コンパリジョンモード
 右下のジャンプバーで任意のバージョンに飛ぶことができる。
 真ん中の下のボタンで、タイムライン表示ができる。

2011年6月14日火曜日

Xcode 4の新概念

WWDC 2010のXcode4解説ビデオがiTunesUから既に無くなっている。
ダウンロードしておいてよかった。

ー ワークスペース ー
WorkSpaceというのがあるらしい。
プロジェクトも入ってない空の箱らしい。
Files- AddFilesでプロジェクトを読み込むことができる。ドキュメントも左のタブに読み込むことができる。また、スキームという概念のものも組み込むこおができる。Launch Schemes, Distribution Schemesといったものだ。
よくわからない。

プロジェクトはWorkSpace間でシェアすることができる。スキームマネージャで共有を選ぶらしい。

プロジェクトの中のファイルを編集するのはあまり変わらない。

ー ナビゲータ ー
ナビゲータとういうのが左の選択ボタンにある。クラス分類、サーチ、ブレークポイント、ログなどがある。
下にはフィルタリングのウィンドウがある。

ー エディター ー
スタンダード、アシスタント、バージョンエディタの3つがある。

ファイルとしては、ソース、インターフェースビルダ、データモデル、HEx, Previewがある。
ジャンプバー、アシスタントエディタ、インスペクター、ライブラリがある。

*.h と *.m を左右にならべ、ドラック&ドロップでインスタンスをコピーできる。

.nibファイルを選択すると、左にビルダー、右にソースなどで編集可能となる。
この際、ボタンとコードの間でドラックすると、アクションが実装できたりする。

範囲選択して、コードライブラリにドラックすると、そのコードが自動でカスタムコードとしてライブラリに格納される。ショートカットも登録できる。
すげー。

データモデルは、エンティ、アトリビュートを登録でき・・よくわからん。
まだ、つかったことないからな・・

ファイルは任意にHexエディットができる。

選択した型などは、左に説明がでてくれる。

ー オーガナイザー ー
Window - Organizerで起動する。
ドキュメントタブを選択すると、クラスリファレンスを見ることができる。
iPhoneタブでは、・・・
リポジトリタブでは、・・・
プロジェクトタブでは・・・
アーカイブタブでは・・・

ー バージョンエディタ ー
右の左から2?3?番目はバージョンエディタといい、だれがいつ変更したか記録を見ることができる。
異なるバージョンを左右で比較してみることができる。まんなかの黒いものが日付などのバージョンで選択して比較することができる。

ー デバッキング ー
あまり変わらない。
ブレークポイントでとまると、コンソールが自動で表示される。
エラーは真ん中の上にでて、クリックすると左のタブとコードに飛ぶことができる。

ー スキーム ー (新コンセプト)
ビルド/オブジェクトの生成を計画することができる。チーム作業に使うらしい。

ビルドフェーズ ー ターゲットの生成
テストフェーズ ー ユニットテスト、性能テスト・・
ラウンチフェーズ ー 

しかし、今つかっていない機能はやっぱりよくわからないなぁ・・