--
--/--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2012
04/23


アプリを使っていて気になったコト、要望等あればどしどしコメントください。
このエントリを更新することで、皆さんへの返信をしていきたいと思います。

Mr.小役
http://itunes.apple.com/jp/app/mr.-xiao-yi/id519019029?mt=8

Mr.小役のFacebookページ
http://www.facebook.com/MrKoyaku
こちらもブログのサポートと連動して運用していきたいと思います。




2012
04/23


2012/04/20
無事にアプリをリリースしました。
万人に使ってもらえるアプリではないですが。。

全国のスロッターが使ってくれることを願っております。

『Mr.小役』
http://itunes.apple.com/jp/app/mr.-xiao-yi/id519019029?mt=8


2012
03/12


UIPickerView の項目の選択がうまく反映されない理由を紐解くヒントになるかもしれないエントリ。

UIPickerView にて各列の項目を選択したときにコールされる delegate メソッド
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
は、この UIPickerView の各コンポーネントが全て静止して始めてコールされる。

例えば、3つのコンポーネントを持つ UIPickerView の一番左のコンポーネントを選択(動か)している最中に他のコンポーネントを操作すると、左のコンポーネントが停止しても、他コンポーネントがスクロール中であれば、そのタイミングで上記メソッドはコールされない。
ということ。

どういうことかわかりやすくするためにあるサンプルを書いてみました。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {

UILabel *selectValueLabel; // ピッカー選択変更時処理がコールされた際の値表示ラベル
NSInteger value1; // 左の列の選択値
NSInteger value2; // 中央の列の選択値
NSInteger value3; // 右の列の選択値
}

@end


画面は下のような感じです。

UIPickerViewSample.png

画面上部のラベルが selectValueLabel。
ピッカーに関してはコンポーネントの値を左からそれぞれ、value1、value2、value3と定義しています。
ピッカーの選択を変更したタイミングで、上記ラベルの値も書き換えるといった簡単なアプリです。

で、問題のある処理はこちら。
(すべての処理は書きませんが、上記メソッドの部分だけ書きます)

ViewController.m

#pragma mark ピッカー選択変更時処理
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

// 値が変更された列の、選択された行番号を変数に格納
switch (component) {
case 0:
value1 = row;
break;
case 1:
value2 = row;
break;
case 2:
value3 = row;
break;
default:
break;
}

// ラベルに表示
[selectValueLabel setText:[NSString stringWithFormat:@"%d %d %d", value1, value2, value3]];
}


このサンプルで問題なのは、コンポーネントを同時に動かしてしまうと、最後に停止したコンポーネントの値しか取得できないということ。
画面はこんな感じで表示されます。
左のコンポーネントを9までスクロールしている最中に、真ん中のコンポーネントを9までスクロールさせたパターンのキャプチャです。

UIPickerViewSampleError.png


結論としては、
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
メソッドがコールされるタイミングで、全てのコンポーネントの値を取得するべきである。

修正したサンプルはこれ。

ViewController.m (修正版)

#pragma mark ピッカー選択変更時処理
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

// 全ての列の選択行番号を変数に格納
value1 = [pickerView selectedRowInComponent:0];
value2 = [pickerView selectedRowInComponent:1];
value3 = [pickerView selectedRowInComponent:2];
// ラベルに表示
[selectValueLabel setText:[NSString stringWithFormat:@"%d %d %d", value1, value2, value3]];
}


コンポーネントが停止したタイミングで、全てのコンポーネントの現在選択中の値を取得してしまえば、上記の問題はなくなるはずです。

UIPickerViewSampleModified.png


僕の気のせいだと思いますが、iOS4.x のときにこんな問題なかったような。。。

2012
02/28


俗に言う ModalViewタイトルバーを設置する際に方法に困ったのでメモ。

UIViewController の presentModalViewController: メソッドを使用した際に、遷移先の画面にタイトルが表示されなかったので、タイトルバーの設置方法を書きます。
「僕自身が困っているのであれば、きっと誰かも困ってるはず!」という大義名分のもと、未来の自分の為にソースを全て記載。

ViewController.h

#import <UIKit/UIKit.h>
#import "ModalViewController.h"

@interface ViewController : UIViewController {

}

@end


ViewController.m

#import "ViewController.h"

@implementation ViewController

#pragma mark 初期処理
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// "SHOW MODAL VIEW"ボタンのアクションを登録
UIButton *button = (UIButton *)[self.view viewWithTag:1001];
[button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
}

return self;
}

#pragma mark SHOW MODAL VIEW ボタン押下時処理
- (void)tapButton:(UIButton *)sender {

// 表示するModalViewのコントローラを生成
ModalViewController *modalViewController = [[[ModalViewController alloc] initWithNibName:@"ModalView" bundle:nil] autorelease];
// ModalViewのナビゲーションコントローラを生成
UINavigationController *naviController = [[[UINavigationController alloc] initWithRootViewController:modalViewController] autorelease];
// ModalViewの表示
[self presentModalViewController:naviController animated:YES];
}

@end


ModalViewController.h

#import <UIKit/UIKit.h>

@interface ModalViewController : UIViewController {

}

@end


ModalViewController.m

#import "ModalViewController.h"

@implementation ModalViewController

#pragma mark 初期処理
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// タイトルの設定
[self setTitle:@"MODAL"];

// "CLOSE MODAL VIEW" ボタンのアクション登録
UIButton *button = (UIButton *)[self.view viewWithTag:2001];
[button addTarget:self action:@selector(tapCloseButton:) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}

#pragma mark CLOSE MODAL VIEW ボタン押下時処理
- (void)tapCloseButton:(UIButton *)sender {

// ModalViewを閉じる
[self dismissModalViewControllerAnimated:YES];
}

@end


InterfaceBuilder にて BaseView のボタンと ModalView のボタンにそれぞれ 1001, 1002 のタグを割り当ててます。

ViewController の画面がこれ。
BaseView.png


ModalViewController の画面がこれ。
ModalView.png


書いていて疑問に思ったんですが、dismissModalViewControllerAnimated: メソッドは ModalViewController 側の処理でいいんですかね?

また調べなきゃいけないことが増えてしまった。
とりあえず、今日はここまで。


2012
02/15


備忘録。

Objective-C で日付フォーマットを指定する際のミリ秒のフォーマットを忘れてしまった。
書いておぼえます。

【サンプル】

#pragma mark 現在日付を文字列で取得する処理
- (NSString *)getCurrentDateString {

// 現在の日付を取得
NSDate *currentDate = [NSDate date];
// 日付フォーマットオブジェクトの生成
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// フォーマットを指定の日付フォーマットに設定
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss.SSS"];
// 日付型の文字列を生成
NSString *dateString = [dateFormatter stringFromDate:currentDate];

return dateString;
}


せっかくなんで、大体のフォーマットも書いておく。

G:時代(AD)
yy:西暦の下2桁(12)
yyyy:西暦(2012)
M:月(1~12)
MM:月(01~12)
MMM:月(1月)
MMMM:月(1月)
d:日(5)
dd:日(05)
EEE:曜日(水)
EEEE:曜日(水曜日)
aa:午前/午後
H:時(0~23)
HH:時(00~23)
K:時(0~11)
KK:時(00~11)
m:分(0~59)
mm:分(00~59)
s:秒(0~59)
ss:秒(00~59)
S:ミリ秒

曜日が(Wed)のような英語表記になる場合は、端末の言語設定が英語環境になってる場合ですかね。


プロフィール

Author:Taku Sasahara
Hello world!!

バジルの息子。
法学部法律学科卒。
バリバリの文系プログラマです。
ペーペーです。

Facebook

My faborite books
僕のお気に入り書籍の本棚

最新トラックバック

スポンサーリンク

検索フォーム

ブロとも申請フォーム

QRコード
QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。