2009/11/30

[gadget]どのタブが選択されたか確認する方法

前回のタブが選択されたときに関数を呼び出す方法を書きましたが、ここで問題となるのは、すべてのタブに同じ関数をセットした場合に、果たしてどのタブが選択されたのかわからないこと。

かと言って、同じ処理を持った関数をタブの個数分名前だけ変えて定義するのもソースの無駄になるので、今日は、どのタブが選択されたのか確認する方法について書いていきたいと思います。

実装としてはこんな感じ

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Test"
directory_title=""
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>
<Require feature="tabs" />
</ModulePrefs>
<Content type="html">
<![CDATA[
<style type="text/css">
</style>
<div id="id_meiji" style="display:none;"></div>
<div id="id_taisho" style="display:none;"></div>
<div id="id_showa" style="display:none;"></div>
<div id="id_heisei" style="display:none;"></div>


<script type="text/javascript">
gadgets.util.registerOnLoadHandler(lf_init);

function lf_init(){
var tabs = new gadgets.TabSet(__MODULE_ID__);
tabs.addTab("明治","id_meiji",lf_selected);
tabs.addTab("大正","id_taisho",lf_selected);
tabs.addTab("昭和","id_showa",lf_selected);
tabs.addTab("平成","id_heisei",lf_selected);
}

function lf_selected(atabId){
alert(atabId);
}
</script>
]]>
</Content>
</Module>

前回と違うのは、lf_selectedに引数を追加したこと。

これによって、実は、選択されたタブをidを返してくれるんですねー。

なんと便利な。

実行結果は、このような感じになります。

Photobucket
上は大正を選んだ時の模様

実は、各タブはindexも保持しており、indexで取得したい場合は、このような感じになります。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Test"
directory_title=""
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>
<Require feature="tabs" />
</ModulePrefs>
<Content type="html">
<![CDATA[
<style type="text/css">
</style>
<div id="id_meiji" style="display:none;"></div>
<div id="id_taisho" style="display:none;"></div>
<div id="id_showa" style="display:none;"></div>
<div id="id_heisei" style="display:none;"></div>


<script type="text/javascript">
var tabs = new gadgets.TabSet(__MODULE_ID__);

gadgets.util.registerOnLoadHandler(lf_init);

function lf_init(){
tabs.addTab("明治","id_meiji",lf_selected);
tabs.addTab("大正","id_taisho",lf_selected);
tabs.addTab("昭和","id_showa",lf_selected);
tabs.addTab("平成","id_heisei",lf_selected);
}

function lf_selected(){
var selectedtabindex = tabs.getSelectedTab();
selectedtabindex = selectedtabindex.getIndex();
alert(selectedtabindex);
}
</script>
]]>
</Content>
</Module>

実行結果はこのようになります。

Photobucket
画像は昭和を選択したときのもの。

getSelectedTab()メソッドによって、一度、gadgets.Tabオブジェクトを取得し、またgetIndex()によって、indexを取得しています。

各indexはaddTabで設定できるのですが、設定しなかった場合は、1つづ値が増えていきます。

最初は0からスタートです。
(なので、明治を選んだ場合は0と表示されます。)

これでindexとidによる取得と両方に対応できるようになりました。

次回は、選択したタブを保持する方法について。

2009/11/29

[gadget]タブ選択時に関数をコール

タブが選択された場合に関数をコールする方法はこんな感じになります。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Test"
directory_title=""
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>
<Require feature="tabs" />
</ModulePrefs>
<Content type="html">
<![CDATA[
<style type="text/css">
</style>
<div id="id_meiji" style="display:none;"></div>
<div id="id_taisho" style="display:none;"></div>
<div id="id_showa" style="display:none;"></div>
<div id="id_heisei" style="display:none;"></div>


<script type="text/javascript">
gadgets.util.registerOnLoadHandler(lf_init);


function lf_init(){
var tabs = new gadgets.TabSet(__MODULE_ID__);
tabs.addTab("明治","id_meiji",lf_selected);
tabs.addTab("大正","id_taisho",lf_selected);
tabs.addTab("昭和","id_showa",lf_selected);
tabs.addTab("平成","id_heisei",lf_selected);
}

function lf_selected(){
alert("選択されました");
}
</script>
]]>
</Content>
</Module>

実際タブが選択されたときに呼び出される関数は、addTabメソッドの第三引数で設定します。

実行結果はこのような形になりました。
Photobucket

だいぶ前に、書いたタブの作成方法とは若干違うところがあり、addTabメソッドの第二引数が追加されているところ。

これは何かというと、divタグのid属性を指定すれば、そこにタブを生成しますよぉーというもの。

ただし、こちらのリファレンスにもあるようにstyle="display:none;"といちおう書いておきました。

もちろん各addTabメソッドにおいて、別々のファンクションを設定することも可能です。

これでタブが選択された場合の処理も書くことができます。

2009/11/28

[javascript]干支を(確認|取得)する

今度のガジェットで使おうかなと思い、JavaScriptで実装

の前に干支の算出方法(アルゴリズム)の確認はこちらで行いました。

同様に、西暦(あるいは皇紀)で表した値を12で割った余りを求め、下表から十二支を割り出す。

余り01234567891011
十二支

via:wikipedia:干支


というわけでプログラムはこのようになりました。
var sexagenary_cycle = ["申","酉","戌","亥","子","丑","寅","卯","辰","巳","午","未"];

function lf_getSexagenary(aYear){
return sexagenary_cycle[aYear%12];
}

実際に試しにいくつか入力してうまくいったので、オッケーかなーっと。。。

2009/11/27

[Objective-C][iPhone sdk][google maps]pinを表示その3

UIViewControllerを使わなくてもピンの色を変更して表示できました。

プログラムがめちゃくちゃ長いですが、お付き合いください。

/* MapViewDelegate.h */
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MapViewDelegate : NSObject <MKMapViewDelegate>{

}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

@end

/* MapViewDelegate.m */
@implementation MapViewDelegate

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

MKPinAnnotationView *pinannotationview = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"];
pinannotationview.pinColor = MKPinAnnotationColorPurple;
pinannotationview.animatesDrop = NO;
return pinannotationview;

}

@end

/* AnnotationToMap.h */
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface AnnotationToMap : NSObject <MKAnnotation>{
CLLocationCoordinate2D coordinate;
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) coord;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@end

/* AnnotationToMap.m */
#import "AnnotationToMap.h"
@implementation AnnotationToMap
@synthesize coordinate;

-(id)initWithCoordinate:(CLLocationCoordinate2D) coord{
self = [super init];
coordinate = coord;
return self;
}

@end

/* MapTestAppDelegate.m */
CLLocation *location = [[CLLocation alloc] initWithLatitude:35.660262 longitude:139.729548];
CLLocationCoordinate2D mapcenter = location.coordinate;
[location release];

MKMapView *mapview = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
MKCoordinateSpan CoordinateSpan = MKCoordinateSpanMake(0.005,0.005);
MKCoordinateRegion CoordinateRegion = MKCoordinateRegionMake(mapcenter,CoordinateSpan);
[mapview setRegion:CoordinateRegion animated:YES];

MapViewDelegate *mapviewdelegate = [[MapViewDelegate alloc] init];
mapview.delegate = mapviewdelegate;

AnnotationToMap *annotationtomap = [[AnnotationToMap alloc] initWithCoordinate:mapcenter];
[mapview addAnnotation:annotationtomap];
[annotationtomap release];

[window addSubview:mapview];
[mapview release];
[window makeKeyAndVisible];

で、実行結果はこのような形になりました。

Photobucket
ピンの色が変わらなかった原因として、mapviewのdelegateプロパティを設定していなかったために引き起こされたバグでした。

色々と記事を読んでみると、UIViewControllerにdelegate対象となるmapviewdelegateを継承しているのが多かったのですが、いまいち納得がいかなく、今回、あえて外だしにしてみました。

割と納得いってるのですが、どうでしょうか?

ここまできちんと書くとオープンソースとして配信したくなってしまう。
Interface Builderを使わないサンプルプログラムとしてばんばん公開しようかなーって思うのですが、時間すごく喰いそうなので、う〜〜〜ん、どうしようぉ〜〜〜。

やりたいことが多すぎるぅ。。。

参考したサイト|ブログ(多くてすみません)
MKMapView上にアノテーションを追加する
How to add a pin to embedded map
Using iPhone SDK MapKit Framework – A tutorial
iPhoneアプリで地図を取り扱う、MapKit Framework
iPhoneのGPSとMapKitを使った地図を連動させる方法CommentsAdd Star

2009/11/26

[gadget]onloadを行なう

iPhoneアプリの年齢早見というアプリがあって、ものすごく重宝しているのですが、業務中に使うことに躊躇してしまい(さぼっていると思われてしまうので)、でもものすごく便利なので使いたいなーっとなんとかならないものかと考えていたら、iGoogle gadgetにしてしまえばいいじゃーんと思い、急遽gadgetを作成しようかなと。

guiも似ているし、そもそもアイデア自体も作者さんのものなので、KS Planning Inc.さんのブログできちんとgadgetの作成の許可を申請し、きちんとオッケーを頂いたので問題なく作ることができます。

そこで、iPhoneのアプリと同時並行でガジェットの作成も進行します。

で、今日は、久々のガジェットネタ。

gadgetのパフォーマンスアップの一環として、loadしきってから、中のコンテンツを色々とセットしていきたい場合があります。

webサイトなどを作っている場合などは、JavaScriptのonloadをコールすればいいのですが、gadgetの場合、それに相当するものは、gadgets.util.registerOnLoadHandlerとなります。

実装としてこんな感じ

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Test"
directory_title=""
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>
</ModulePrefs>
<Content type="html">
<![CDATA[
<style type="text/css">
</style>
<div id="hoge">カレー</div>

<script type="text/javascript">
gadgets.util.registerOnLoadHandler(lf_init);

/* onload時コールされる */
function lf_init(){
document.getElementById("hoge").innerHTML = "シチュー";
}
</script>
]]>
</Content>
</Module>

実行結果はこのような形となりました

Photobucket

きちんと「シチュー」という単語が挿入されています。

ちなみに、lambdaも使うことができます。

その場合は、こんな感じになります。(firefox 3で確認)

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Test"
directory_title=""
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>
</ModulePrefs>
<Content type="html">
<![CDATA[
<style type="text/css">
</style>
<div id="hoge">カレー</div>

<script type="text/javascript">
gadgets.util.registerOnLoadHandler(function(){alert('hoge');});
</script>
]]>
</Content>
</Module>

今回、igoogle上だけしか確認していないのですが、mixi上でも動作すると思います。

2009/11/25

[coldfusion]9がリリースされてました。

まだ何が新しくなっているのか確認できていませんが。。。
こちらで正式にアナウンスされています。

[igoogle gadget]social機能がリリースされました

昼寝している間に、ものすごいことが起きていました。

既に海外では確かリリースされていたのですが、いよいよ日本版が上陸しました。

この日をどのぐらい待ち望んでいたか!!

詳しいことは、こちらに譲りますが、mixi並みにリッチでパワフルなアプリケーションを開発することができます。

最近、iPhoneの開発とかiGoogle gadgetの開発などがあって、猛烈に大変です。

2009/11/24

[Objective-C][iPhone sdk][google maps]pinを表示その2

おとといぐらいから調査を続行しているpinを表示する方法ですが、やはりぐぐってみるとかなり多くの記事においてUIViewControllerにMKMapViewDelegateを継承しています。

なぜじゃー??

あまり考えることなく実装したほうがいいのかなと。

2009/11/23

27に

なりました

2009/11/22

[Objective-C][iPhone sdk][google maps]pinを表示その1

まだ完全にできていないので、その1として

地図上にピンを表示させます。
プログラムは下記をご覧ください。

/* MapTestAppDelegate.m */
CLLocation *location = [[CLLocation alloc] initWithLatitude:35.660262 longitude:139.729548];
CLLocationCoordinate2D mapcenter = location.coordinate;
[location release];

AnnotationToMap *annotationtomap = [[[AnnotationToMap alloc] initWithCoordinate:mapcenter] retain];

MapView *mapview = [[MapView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
MKCoordinateSpan CoordinateSpan = MKCoordinateSpanMake(0.005,0.005);
MKCoordinateRegion CoordinateRegion = MKCoordinateRegionMake(mapcenter,CoordinateSpan);
[mapview setRegion:CoordinateRegion animated:YES];

[mapview addAnnotation:annotationtomap];
// Override point for customization after application launch
[window addSubview:mapview];
[window makeKeyAndVisible];

/* MapView.h */
#import <MapKit/MapKit.h>

@interface MapView : MKMapView <MKMapViewDelegate> {

}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

@end

/* MapView.m */
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

MKPinAnnotationView *pinannotationview = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"];
pinannotationview.pinColor = MKPinAnnotationColorPurple;
pinannotationview.animatesDrop = YES;
return pinannotationview;

}

/* AnnotationToMap.h */
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface AnnotationToMap : NSObject <MKAnnotation>{
CLLocationCoordinate2D coordinate;
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) coord;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@end

#import "AnnotationToMap.h"


/* AnnotationToMap.m */
@implementation AnnotationToMap
@synthesize coordinate;

-(id)initWithCoordinate:(CLLocationCoordinate2D) coord{
self = [super init];
coordinate = coord;
return self;
}

@end

実行結果はこのようになりました。
Photobucket
ピンは表示できたけど、ピンの色が紫色になっていないので、バグが発生しています。

今、調査中ですが、おそらくViewControllerを使わないといけないのかもしれません。

2009/11/21

[Objective-C][iPhone sdk]iPhoneでsqliteを使用について

ColorMakerの次期バージョンでは、いくつかの案があるのですが、その中で、sqliteを使ってデータを保存したいなーと思い、保存方法及びsqliteの使用方法について調べてみることにしました。

が、

ぐぐってみると、

SQLite and CoreData - iPhone SDK Articles

に、OSのバージョン3からはsqliteではなく、Core Dataが推奨されているみたいなのですが、実際、iPhone OS Technology OverviewのSQLiteを読むと、やはりサポートされているのでできればこちらを使いたいです。

というのもCore Dataのマニュアルが膨大すぎて、sqlの方が工数がかからなさそうだと思ったので。。。
(先々にちょっとやりたいなーっと考えているgoogle app engineのことを考えるとやった方がいいのかなと思ったりもするのですが)

なわけで、sqliteで突撃~~~♪

2009/11/20

[Objective-C][iPhone sdk][google maps]特定の住所を地図上に表示する

ちょっとぐぐってみてわかったのですが、ほとんどの記事は、現在位置を地図上に表示する方法について書いてありましたが、任意の場所(所定の好きな場所)を地図上に表示する方法はなかったので、実装してみることにしました。

この場合、重要となるのは表示したい場所の経度と緯度がわかること。

今回の例として、「六本木ヒルズ」を地図上で表示するとします。

すっげー前の記事に住所から経度と緯度を取得するサイトを紹介したので、そこで、「六本木ヒルズ」と打ち込んで検索を行います。

すると、経度と緯度が表示されるので、それをどこかにメモしておきます。
(検索したときは、緯度:35.455006、経度:139.729548と表示されました。)

そこで、メモした内容をふまえて以下のように実装します。


/* googleの地図をコールするクラスを作成し初期化を行う(インスタンス変数) *
MKMapView *mapview = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

/*
地図をどのぐらい拡大させるか設定を行う(MKCoordinateSpanは構造体で、
MKCoordinateSpanMakeをコールすればオッケー♪)
*/
MKCoordinateSpan CoordinateSpan = MKCoordinateSpanMake(0.005,0.005);
/* ど真ん中の座標を設定(35.660262と139.729548はさっきメモしたもの) */
CLLocation *location = [[CLLocation alloc] initWithLatitude:35.660262 longitude:139.729548];

/* CLLocationCoordinate2Dも構造体なんだけど、こちらはプロパティを使えば楽勝 */
CLLocationCoordinate2D mapCenter = location.coordinate;

/*
CLLocationCoordinate2DとMKCoordinateSpanを
MKCoordinateRegionMakeでMKCoordinateRegionとしてドッキング
*/
MKCoordinateRegion CoordinateRegion = MKCoordinateRegionMake(mapCenter,CoordinateSpan);

/* 地図を表示しまーす(アニメーションも、もちろんYES) */
[mapview setRegion:CoordinateRegion animated:YES];

/* だけど大本のwindowに貼付けないと表示されないので、お約束で追加 */
[window addSubview:mapview];
[window makeKeyAndVisible];

で、この実行結果は、、、
Photobucket
キター表示できたぞ!!

これでどこでも好きな場所をしょっぱなから表示することができます。

なんて便利なんだ♪

2009/11/19

[Objective-C][iPhone sdk][google maps]地図を表示

ついにキター!!

念願のgoogle map表示

iPhone Application Programming GuideのDisplaying Maps and Annotationsを読んで、下記のように実装しました。

- (void)applicationDidFinishLaunching:(UIApplication *)application {
MKMapView *mapview = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[window addSubview:mapview];
[window makeKeyAndVisible];
}

ソースの中身自体はたったの、3行で、できちゃいました。

実行結果はこのような形です。
Photobucket
しかも、ダブルクリックしたら地図がでかくなりました。
(うれしい誤算です。)
Photobucket
この調子で今度は、座標を指定して特定の位置を表示する方法に着手したいと思います。

2009/11/18

[javascript]aタグのonclickについて

aタグのhref属性ではなくて、onclickでページのリンクを実現するために下記のようなプログラムを作成しました。

<a href="void(0)" onclick="(function(){location.href='http://yahoo.co.jp';}());">
Test
</a>

実際にクリックしてみると、どういうわけか、リンク先に画面が遷移しません。

ちょっと調べてみると、IE6の仕様っぽくて、return falseを入れないと画面が遷移しないみたいなのです。

というわけで、return falseを入れた最終的なプログラムはこちらになります。
<a href="void(0)"
onclick="(function(){location.href='http://yahoo.co.jp';}());return false;">
Test
</a>

動かしてみると、無事にリンク先に遷移しました。

めでたし、めでたし

参考サイト:location.href

2009/11/17

[mac][objective-c]frameworkの追加方法

mapkitフレームワークを追加したいなーっと思い方法を調べてみることにしました。

Xcode Project Management GuideのLinking Libraries and Frameworksを見たのですが、ちょっとやり方が気にくわなかったので、Spotlightからmapkitと検索をして、いくつかヒットしたうちのiPhone sdk ver 3.0の中にあるmapkitを追加しました。

追加方法は、frameworksと書かれたフォルダを「Control+クリック」を行い、追加→既存のワークフレームを選択するとファイル選択画面がオープンするので、そこから指定し追加を行いました。

無事にframeworksフォルダには、mapkitフレームワークが追加されているのでいいのかなと。

ただし、sdkのバージョンそのものをあげてしまった場合、同様に、このフレームワークのバージョンもあげないといけないのかなーっと。

そこは注意したいですね。

これで先に進める。。。