iPhoneプラグラミングメモ。
たとえばコミケのスペースの座標をまとめた配列を作るとき
「Aブロックの、1番目の、左上座標」みたいな表になるわけですが
NSDictionary *mapPosList = [NSDictionary dictionaryWithObjectsAndKeys: [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:100], @"left", [NSNumber numberWithInt:200], @"top", [NSNumber numberWithInt:50], @"width", [NSNumber numberWithInt:125], @"height", nil ], nil ], @"A", nil ]; NSLog(@"%d", [[[[mapPosList objectForKey:@"A"] objectAtIndex:0] objectForKey:@"left"] intValue]);
という感じの、一目みてもわけわからん定義と呼び出しになるわけです。
もっとスマートな記述方法ないですかねえ…。
ActionScriptや JavaScriptに慣れていると
var mapPosList:Objects = { "A":[ {left:100, top:200, width:50, height:125} ] }; trace( mapPosList['A'][0].left );
くらいシンプルなのが当たり前だからなぁ…。
XMLで座標一覧作って、XPath使うのが一番スマートかもしれない。
全データ舐めるってわけじゃないし。
動的に複数のボタンを作っていたら、ボタンを押したとたん落ちてしまう。
そんな状態にハマりました。^^;
CGRect rect = CGRectMake(mapX, mapY, MAP_DESK_YOKO_W, MAP_DESK_YOKO_H); UIButton *button = [[UIButton alloc]initWithFrame: rect]; [button addTarget:self action:@selector(mapButtonTouch) forControlEvents:UIControlEventTouchUpInside]; [button setBackgroundColor:[UIColor redColor]]; button.tag = count;
comikechk[4537:207] *** -[ComikeMapViewController mapButtonTouch]: unrecognized selector sent to instance 0x48609a0
なんだろーなんだろーと検索しても有効な情報が得られない。
ふと、作例を載せているサイトを見ていたら…あっ!!
[button addTarget:self action:@selector(mapButtonTouch:) forControlEvents:UIControlEventTouchUpInside];
@selectorでメソッドを指定する時に最期の「:」を付け忘れただけでした。
うわー、まぬけすぎるw
iPhoneプログラミングメモ。
処理進行中を表すために用いられるくるくる回るアニメーション
UIActivityIndicatorView が用いられますが、解放関係でハマったのでメモ。
[indicator stopAnimating]; [indicator removeFromSuperview]; [indicator release];
アニメーションをストップして、ビューから外して、解放しています。
が、このコードだと
-[UIActivityIndicatorView stopAnimating]: message sent to deallocated instance
なんてエラーになってしまいました。
releaseの後にさらに nilを代入したら問題なく動作するようになりました。
[indicator stopAnimating]; [indicator removeFromSuperview]; [indicator release]; indicator = nil;
おそらく他の部分で UIActivityIndicatorViewインスタンスの有無を
チェックして処理をわけている箇所があるので、そのへんが関係あるのかも。
ないのかも。
if( indidator ){ 〜くるくるアニメがある時の処理〜 }
あとはこのへんが多少なりとも関係しているんでしょうか?
はじめてのあいぱっどあぷり。
略して「はじあい」。
そんなワタクシですが無謀にもCoreDataにまで手を出しています。
で、日本語検索が出来なくてハマったのでメモ。
「day」という項目に曜日が格納されており、
それごとにデータを抽出しようとしています。
「dayList」は曜日一覧をまとめたNSArray。
「gNowDay」は現在表示させたい曜日の番号です。
NSPredicate *preDay = [NSPredicate predicateWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; [request setPredicate:preDay];
これだとダメでした。
「'%@'」の部分を「'土'」など決め打ちにしたらいけました。
次はうまくいったコード。
NSString *preDayStr = [NSString stringWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; NSPredicate *preDay = [NSPredicate predicateWithFormat:preDayStr]; [request setPredicate:preDay];
一度NSStringに格納してからやったら出来ました。
そういうもんなのかー。
そしてこれは複合条件の指定。NSCompoundPredicateを使います。
「土曜の東館」とか指定するわけですね。
NSString *preDayStr = [NSString stringWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; NSPredicate *preDay = [NSPredicate predicateWithFormat:preDayStr]; NSPredicate *preArea = [NSPredicate predicateWithFormat: @"areaCode == %d",areaCode]; NSPredicate *allPre = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: preArea, preDay, nil]]; [request setPredicate:allPre];
もんのすごい単純なことでドハマりました…。
float floatNum = 128 / 255; NSLog(@"%f", floatNum); // 結果は「0.0000〜」
float floatNum = 128.0 / 255.0; NSLog(@"%f", floatNum); // 結果は「0.501960〜」
小数点のついた値でないと切り捨てられちゃうのかーーーー!!!
c言語ってのはそういうもんなんですか?
しかし整数で格納している値を計算して小数点を出したい時は
どうやって「.0」をつければいいんだろう…。
int intNum = 10; float floatNum = intNum; NSLog(@"%f", floatNum/50); // 結果は「0.2000〜」
なるほど、いったん float型に代入すればいいのか。
って、めんどくさいw
iPhoneプログラミングメモ。
htmlなどで使う16進数の色を10新数の数値に変換する方法。
NSString *colorString = @"ff0000"; int r,g,b; sscanf([colorStr UTF8String],"%02X%02X%02X",&r,&g,&b);
NSScanner の scanHexInt を使ってもできるみたいだけど、
こっちのがシンプルなので。
#defineを使う方法なんてのもあるんですね。
#define HEXCOLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 green:((c>>8)&0xFF)/255.0 blue:(c&0xFF)/255.0 alpha:1.0]; UIColor *color = HEXCOLOR(0xff00ff);
吉里吉里で使うボタン画像は横方向に連結したものを使います。
Photoshopでも作れるのですが透明部分を含んでいる場合に結合が面倒なので
(どこが境目かわかりにくいから)
画像連結ツールを作ってしまいました。
ダウンロードしたファイルをダブルクリックするとインストーラーが立ち上がります。
AdobeAIRがない環境では AdobeAIRも一緒にインストールされます。
「発行者:不明」になってますが気にしないでください。
スタートメニューのプログラムに 画像連結「むすびちゃん」 が登録されます。
連結方向、ファイル名修飾、保存先を設定し、
連結した画像をまとめてドロップするだけです。
入力対応画像フォーマットは PNG / JPEG / GIF で、出力は PNGのみです。
特徴としては透過PNGにも対応しています。
画像連結ツールっていくつかあるんですが、
透過PNGには対応していなかったり、
画像選択が面倒だったり、
自分に合うのがなかったのです。
もっとお気楽極楽に使えるものがほしい!
そんな願いの篭もったツールです。
もっとみんなが作ったえろげがほしい!
そんな願いも篭もってます。
数値を3桁ごとに「,(カンマ)」で区切るのを調べていたら
WadadanetさんのAS3で数字を3桁毎にコンマ区切りにするが見付かり
目的を達することは出来たのですが、構文の中に「?=」や「?:」など意味のわからないものが。
Twitterで質問してみたら正規表現の「先読み」らしいことがわかりました。
大ざっぱに言うと、
マッチングはするけど、カーソルは先読み部分の前で止めちゃうよ
ということなのですね。
そんなわけで自分向けメモ。
javascriptで書くとこんなん。
var maho = "マホは咲の真似してリンシャンあがった"; document.write( maho.replace( /(マホは(?=.+あがった)咲の真似して)/, "$1カンして" ) ); // 先読みを使った結果 // マホは咲の真似してカンしてリンシャンあがった document.write( maho.replace( /(マホは咲の真似して).+あがった/, "$1カンして" ) ); // 先読みを使わない結果 // マホは咲の真似してカンして
先読みを使うと「あがった」の部分までマッチングするけど、
その直前までしか「$1」で取得してません。
従来の方法だと「あがった」まで取得してしまうので、
同じように置換すると後半部分が消えてます。
従来方法で同じ結果を出すならこんな感じでしょうか。
document.write( maho.replace( /(マホは咲の真似して)(.+あがった)/, "$1カンして$2" ) ); // マホは咲の真似してカンしてリンシャンあがった
これでもいいですが、「リンシャンあがった」の部分になんらかの処理を加えたい時、
カーソルは通り過ぎているのでちょっと面倒なことになります。
![]() |
咲-Saki- ラブじゃん マホちゃんの必殺技完成! スクウェア・エニックス スクウェア・エニックス 2010-01-29 |
コマンドリストを実行している時、
途中のコマンドの結果によって分岐させたい時の方法。
var hogeCommand:HogeCommand = new HogeCommand(); var serial:SerialList = new SerialList(); serial.addCommand( hogeCommand ); serial.addCommand( new Func( function():void { // コマンドの結果で分岐 if ( hogeCommand.value ) { serial.insertCommand( new Trace("コマンドを挟む")); } })); serial.execute();
HogeCommandクラスの実行結果を受け取りたいので
インスタンスを先に作っておきます。
var hogeCommand:HogeCommand = new HogeCommand();
今回のキモ「insertCommand」です。
これにより動的にコマンドを挿入させることができます。
// コマンドの結果で分岐 if ( hogeCommand.value ) { serial.insertCommand( new Trace("コマンドを挟む")); }
このやり方についてはIs It So Easy?さんが詳しく書かれています。
this.parentで挿入することも出来るんですねー。
![]() |
[改訂版]ActionScript3.0プログラミング入門 for Adobe Flash CS4/CS3 ビー・エヌ・エヌ新社 2009-07-23 |
いったい何がキッカケだったのかまったくわからないけど、ある日突然出てきたエラー。
Resource.as、行 44
1004: 名前空間が見つからないか、コンパイル時定数ではありません。
progression_internal static const $collection:IdGroupCollection = new IdGroupCollection();
いろいろ試して、音声ファイルがリンケージされていると発生することがわかりました。
下記のようにごく一般的なファイルを普通にリンケージしただけえす。
ファイル:testse.wav
クラス:testse
基本クラス:flash.media.Sound
「最初のフレームに書き出し」のチェックを外すとエラーは出ません。
しかし上記チェックを外すわけにもいかず色々試していたら、
Index.asに下記の行を追加したらエラーが出なくなりました。
function hogehoge():void { getResourceById("hoge").data; }
この関数はどこからも呼ばれませんが、記述しておくだけで良いようです。
バグなのか仕様なのかはわかりませんが、公式のフォーラムに報告しておきました。
![]() |
ActionScript 3.0 エラーアーカイブス コンパイルエラー・コンパイラ警告・ランタイムエラーの解法 大重美幸 ソシム 2009-09-09 |