2011年09月28日

button実装-iOSとandroidの比較

Java人によるObjective-C挑戦


今更ですけど、auのhtc evoを買いました。
今まではipadと普通の携帯電話を使ってました。

これでiOSとandroidが手に入りましたので
今日からは二つを少しづつ比較しながらやって行きたいと思います。

お題
 ボタンを押すとボタンのタイトルラベル名称が変わる

まずは、★iOS★から
いつも通りInterface BuilderにてButtonを貼付けます。
xib_001.jpg


ボタンのタイトルを変更したいので
ctrを押しながらヘッダファイルにドラッグし
ソースと紐づけます。
xib_002.jpg


ボタンを押すイベントをヘッダソースに紐づける為
ボタンを選択し、sent Eventsから「Touch Up Inside」の横の丸を
ヘッダファイルにドラッグしソースと紐づけます。
xib_003.jpg


最後にボタンの実装を書いて終了です。
xib_004.jpg


こんな感じでボタンが変わります。
xib_005.jpg
xib_006.jpg



次は、★android★です。
[res]-[layout]-main.xmlを開き
ボタンを貼付けました。
java_001.jpg


ボタンの押下イベントを作成します。
viewインスタンスのfindViewByIdで特定のボタンの参照を
取得し名称を変更するようにOnClickListenerを実装しました。
java_002.jpg

★ログはLog.v("")でLogCatエリアに出力できるんですね。


次にイベントをボタンに紐づけます。
main.xmlの中のbutton1を探しonclickイベントをセットします。
java_003.jpg


こんな感じでボタンが変わります。
java_004.jpg
java_005.jpg



両者大分ソースの書き方が違うなぁという印象でした。
自分はiOSが好きなんですけど開発はandroidの方がしっくり来ます。。
iOSもjavaでかけたらいいのに。

Java人によるObjective-C挑戦
posted by itokami1123 at 23:42| Comment(0) | 日記

2011年09月24日

UIWebViewを使ってみた

Java人によるObjective-C挑戦


本日は、UIWebViewを使ってみたいと思います。

とりあえずメンバ変数にUIWebView *_webViewを宣言して
動作した結果を受け取りたいのでプロトコルとしてUIWebViewDelegateを宣言しました。
UIWebView001.jpg


そして実際の実装は以下のようになります。


- (void)setAndShowUrl:(NSString*)urlString
{
_urlString=urlString; // テキストボックスに入力されたurlが入ります。

_webView = [[UIWebView alloc] init]; // メモリ確保して初期化!

_webView.frame = CGRectMake(0, 40, 320, 400); // 座標位置とサイズを決定

_webView.scalesPageToFit = YES; // 画面にあうサイズにしてね

[self.view addSubview:_webView]; // 親画面の上にのっかてね

NSURL *url = [NSURL URLWithString:_urlString]; // 文字列をURLとして使える形式に変換

NSURLRequest *req = [NSURLRequest requestWithURL:url]; // URLからリクエストを作る

[_webView loadRequest:req]; // Webサーバにリクエスト実施!!

_webView.delegate=self; // UIWebViewの応答結果は自分で受け取るよ。

}



_webView.delegate=self; すると
ヘッダ部でUIWebViewDelegateプロトコル宣言していたので
自身のクラス実装部にUIWebViewからのメッセージをうけとることが出来ます。

// UIWebViewの読み込み開始イベント
- (void)webViewDidStartLoad:(UIWebView *)webView{
// ↓今読み込んでますよアイコンの表示
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

// UIWebViewの読み込み終了イベント
- (void)webViewDidFinishLoad:(UIWebView *)webView{
// ↓今読み込み終わったよアイコンの表示
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

// ↓試しにjavascriptで表示したhtmlからtitleタグの中身を取得
NSString* title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
NSLog(@"=> %@", title); // ログコンソールに表示
}


読み込みが終わったタイミングでjavascriptを動かしてコンソールにログを出しました。

動作結果は以下になります。
http://www.youtube.com/watch?v=YAh8bT2tL0E




Java人によるObjective-C挑戦
posted by itokami1123 at 03:41| Comment(0) | 日記

2011年09月21日

UITableを使ってみた

今日はUITableを使用して電卓の計算途中を表示するiPhoneアプリを作ってみます。

いつも通りInterface Builderでぺたぺた貼って行きます。
dentakun003-01.jpg

UITableViewのデータを設定するクラスを指定します。
dentakun003-02.jpg

先ほど指定したクラスにプロトコルとして「UITableViewDataSource」を指定します。
※プロトコルはjavaでいうインターフェースに似ているもののようです。
dentakun003-03.jpg

プロトコルで決められているメソッドを実装します。
dentakun003-04.jpg

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section で
何行表示するか指定するようです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath で
セルの内容を確定します。上のメソッドで指定された数呼び出されるようです。



また、データの内容は可変配列「NSMutableArray」で表現しました。
※javaで言う ArrayListのようなものの様です。

まずメモリ確保 ※ javaで言うとnew ArrayList()
NSMutableArray *_numList = [[NSMutableArray alloc] init];

配列のクリア ※javaで言うとArrayList.clear();
[_numList removeAllObjects];

配列数のカウント ※javaで言うと ArrayList.size();
[_numList count];

データの格納(インスタンスならなんでも格納できます)※javaで言うと ArrayList. add("hoge");
NSString *inputNumText = @"hoge";
[_numList addObject:inputNumText ];

データの取り出し※javaで言うとArrayList. get(1);
NSString *arithmeticAndNum = [_numList objectAtIndex:1 ];

実行結果は以下です。



ヘッダソース(.h)は以下のような感じで作成しました。

// Dentakun3AppDelegate.h

#import <UIKit/UIKit.h>

@interface Dentakun3AppDelegate : NSObject <UIApplicationDelegate,UITableViewDataSource>
{
UIWindow *window;
NSMutableArray *_numList;
int sum;

IBOutlet UILabel *selectArithmeticLable;
IBOutlet UITextField *inputNum;
IBOutlet UITableView *_tableView;
IBOutlet UILabel *sumResultLabel;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

- (IBAction)pulusCompute:(id)sender;
- (IBAction)minusCompute:(id)sender;
- (IBAction)multiCompute:(id)sender;
- (IBAction)divideCompute:(id)sender;
- (IBAction)equalCompute:(id)sender;
- (IBAction)clear:(id)sender;

@end



実装ソース(.m)は以下のように作成しました。

// Dentakun3AppDelegate.m
// Dentakun3

#import "Dentakun3AppDelegate.h"

@implementation Dentakun3AppDelegate

@synthesize window=_window;

// テーブル内容の削除
-(void)clearTableData
{
[_numList removeAllObjects]; // 電卓の符号と数値を保存する配列の初期化
selectArithmeticLable.text=@""; // 現在入力中の数値の算術演算子
sum=0; // 合計の数値クリア
sumResultLabel.text = [NSString stringWithFormat:@"%d" , sum ]; // 合計の数値(表示)
[_tableView reloadData]; // テーブルの再描画

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
_numList = [[NSMutableArray alloc] init]; // 電卓の符号と数値を保存する配列のメモリ確保
[self clearTableData]; // テーブル内容の削除
[self.window makeKeyAndVisible];
return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application{}
- (void)applicationDidEnterBackground:(UIApplication *)application{}
- (void)applicationWillEnterForeground:(UIApplication *)application{}
- (void)applicationDidBecomeActive:(UIApplication *)application{}
- (void)applicationWillTerminate:(UIApplication *)application{}

- (void)dealloc
{
[_window release];
[_numList release];
[_tableView release];
[inputNum release];
[sumResultLabel release];
[selectArithmeticLable release];
[selectArithmeticLable release];
[super dealloc];
}

// datasource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [_numList count]; // 行数はデータが格納されている配列の数
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell; // セル作成
cell=[tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
if (!cell) {
cell=[[UITableViewCell alloc]initWithFrame:CGRectZero reuseIdentifier:@"UITableViewCell"];
[cell autorelease];
}

NSString *arithmeticAndNum = [_numList objectAtIndex:indexPath.row ];
cell.textLabel.text= arithmeticAndNum;

if ( indexPath.row == 0 ){ // 1行目は算術演算子無し
int num = [arithmeticAndNum intValue];
sum = num;

}else{ // 2行目以降
NSArray *aNum = [arithmeticAndNum componentsSeparatedByString:@" "]; // 半角スペースでスプリット
NSString *sign = [aNum objectAtIndex:0]; // 配列の0番目(左)算術演算子
NSString *sNum = [aNum objectAtIndex:1]; // 配列の1番目(右)数値

// 数値の演算部
int num = [sNum intValue];
if ( [ sign isEqualToString:@"+" ] ){
sum = sum + num;
}else if ( [ sign isEqualToString:@"-" ] ){
sum = sum - num;
}else if ( [ sign isEqualToString:@"x" ] ){
sum = sum * num;
}else if ( [ sign isEqualToString:@"/" ] ){
sum = sum / num;
}
}

sumResultLabel.text = [NSString stringWithFormat:@"%d" , sum ]; // 合計の数値(表示)

return cell;

}

// 配列にデータを設定
- (void)setNum:(NSString*)arithmetic
{
NSString* iNum = inputNum.text;
if ( [iNum length]>0 && ( [_numList count] ==0 || [selectArithmeticLable.text length ]>0 ) ){
NSString *inputNumText = [NSString stringWithFormat:@"%@ %@",selectArithmeticLable.text,iNum ];
[_numList addObject:inputNumText ];
}
selectArithmeticLable.text = arithmetic;
inputNum.text=@"";
sum=0;
[_tableView reloadData];
}

// ボタン押下イベント
- (IBAction)pulusCompute:(id)sender
{
[self setNum:@"+"];
}
- (IBAction)minusCompute:(id)sender {
[self setNum:@"-"];
}
- (IBAction)multiCompute:(id)sender {
[self setNum:@"x"];
}
- (IBAction)divideCompute:(id)sender {
[self setNum:@"/"];
}
- (IBAction)equalCompute:(id)sender {
[inputNum resignFirstResponder];
[self setNum:@""];
}
- (IBAction)clear:(id)sender {
[self clearTableData]; // テーブル内容の削除
}

@end




Java人によるObjective-C挑戦


posted by itokami1123 at 00:25| Comment(0) | 日記