iPhoneアプリ開発について
iPhoneアプリ開発について
以前、こちらのサイトでiPhone開発の質問をしていた方が
いましたのでつられて質問させて頂きました。
【参考URL】http://itpro.nikkeibp.co.jp/article/COL ... ST=develop
上のサイトを見ながらタブバー(下の黒いバー)を実装しました。
タブバーに5つ以上の要素があるとMore~と表示されて
タブバーの順番を入れ替えられることが出来るようになると思います。
アプリを終了してもこのタブの順番を保持しとく方法はないでしょうか?
いましたのでつられて質問させて頂きました。
【参考URL】http://itpro.nikkeibp.co.jp/article/COL ... ST=develop
上のサイトを見ながらタブバー(下の黒いバー)を実装しました。
タブバーに5つ以上の要素があるとMore~と表示されて
タブバーの順番を入れ替えられることが出来るようになると思います。
アプリを終了してもこのタブの順番を保持しとく方法はないでしょうか?
Re:iPhoneアプリ開発について
NSUserDefaultsでアプリ終了時などのイベントでその順番を覚えておき、起動時に復元すればいいかと。
NSUserDefaultsでのデータ保存-CS193P | seiji blog
http://blog.seiji.me/320.html
NSUserDefaults Class Reference
http://developer.apple.com/iphone/libra ... rence.html
NSUserDefaultsでのデータ保存-CS193P | seiji blog
http://blog.seiji.me/320.html
NSUserDefaults Class Reference
http://developer.apple.com/iphone/libra ... rence.html
Re:iPhoneアプリ開発について
>>Justy様
参考になるサイトをありがとうございます。
>>その順番を覚えておき、起動時に復元すればいいかと
すみません・・・ちゃんと書いておりませんでした。
この順番の取得の仕方がわかりません。
調べてみたのですがそれらしい記事がなくて・・・
参考になるサイトをありがとうございます。
>>その順番を覚えておき、起動時に復元すればいいかと
すみません・・・ちゃんと書いておりませんでした。
この順番の取得の仕方がわかりません。
調べてみたのですがそれらしい記事がなくて・・・
Re:iPhoneアプリ開発について
>この順番の取得の仕方がわかりません
その記事で言うと tabBarController.viewControllersに順番通りに UINavigationControllerが格納されています(NSArray)。
タブバーの入れ替えをおこなうとこの中の順番が入れ替わりますので、これを調べれば
どの UINavigationControllerがどの順番で並んでいるかわかるはずです。
http://developer.apple.com/iphone/libra ... ontrollers
その記事で言うと tabBarController.viewControllersに順番通りに UINavigationControllerが格納されています(NSArray)。
タブバーの入れ替えをおこなうとこの中の順番が入れ替わりますので、これを調べれば
どの UINavigationControllerがどの順番で並んでいるかわかるはずです。
http://developer.apple.com/iphone/libra ... ontrollers
Re:iPhoneアプリ開発について
>>Justy様
参考になるサイトをありがとうございます!!
ただ私では閲覧しただけでは解決することが出来ませんでした・・・
見てみると値が変動しないとnilが入ったままなのですね・・・
一部抜粋なのですが下記のように書いてみました。
しかし値が変動しないです・・・。
ログを見ても[defaults objectForKey:@"SETTINGS"]には値が入っていないので
- (void)deallocで書き込み処理をしているのがまずいのでしょうか?
参考になるサイトをありがとうございます!!
ただ私では閲覧しただけでは解決することが出来ませんでした・・・
見てみると値が変動しないとnilが入ったままなのですね・・・
一部抜粋なのですが下記のように書いてみました。
しかし値が変動しないです・・・。
ログを見ても[defaults objectForKey:@"SETTINGS"]には値が入っていないので
- (void)deallocで書き込み処理をしているのがまずいのでしょうか?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // タブバー viewControllers = [[NSMutableArray alloc] initWithCapacity:0]; NSArray *rssURLArray = [NSArray arrayWithObjects: @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", @"http://itpro.nikkeibp.co.jp/rss/ITpro.rdf", ni[/url]; NSArray *tabBarTitleArray = [NSArray arrayWithObjects: @"ITpro01" @"ITpro02" @"ITpro03" @"ITpro04" @"ITpro05" @"ITpro06" @"ITpro07" ni[/url]; /* NSArray *tabBarIconArray = [NSArray arrayWithObjects: @"itpro_home.png", @"itpro_network.png", @"itpro_security.png", ni[/url]; */ RootViewController *tableViewController; for(int i = 0; i <7; i++){ tableViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain]; tableViewController.rssURL = [rssURLArray objectAtIndex:i]; tableViewController.title = [tabBarTitleArray objectAtIndex:i]; navigationController = [[UINavigationController alloc] initWithRootViewController:tableViewControlle[/url]; navigationController.tabBarItem.title = [tabBarTitleArray objectAtIndex:i]; // navigationController.tabBarItem.image = [UIImage imageNamed:[tabBarIconArray objectAtIndex:i]]; [viewControllers addObject:navigationControlle[/url]; [tableViewController release]; [navigationController release]; } // 読み込み NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; if( [defaults objectForKey:@"SETTINGS"] != nil){ tabBarController.viewControllers = [defaults objectForKey:@"SETTINGS"]; } NSLog( @"%@", [defaults objectForKey:@"SETTINGS"]); tabBarController = [[UITabBarController alloc] init]; [tabBarController setViewControllers:viewControllers]; [window addSubview:tabBarController.view]; [window makeKeyAndVisible]; return YES; } - (void)dealloc { // 書き込み NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:tabBarController.viewControllers forKey:@"SETTINGS"]; [navigationController release]; [tabBarController release]; [window release]; [super dealloc]; }
Re:iPhoneアプリ開発について
> (void)deallocで書き込み処理をしているのがまずいのでしょうか?
あーまずいです。
アプリ終了時にはそれは呼ばれませんので、別のところで処理するようにしてください。
(iOS4なら applicationDidEnterBackgroundあたりいいんじゃないかと思いますが、その辺りは
仕様と要相談です)
あと、NSUserDefaultsに設定を行った後、synchronizeも呼んでおいてください。
NSUserDefaults Class Reference - synchronize
http://developer.apple.com/iphone/libra ... ynchronize
NSUserDefaults:synchronize
http://www.oomori.com/cocoafw/Foundatio ... onize.html
>[defaults setObject:tabBarController.viewControllers forKey:@"SETTINGS"];
基本的にこの NSUserDefaultsは設定値を記憶するもので、全てのオブジェクトのシリアライズを自動でやってくれる
ものではありません。
試してはいませんが、多分 tabBarController.viewControllersのままではうまくいかないと思います。
数値やテキスト、或いはそれらの入った配列オブジェクトなどで保存してください。
そうですね、MSMutableArrayに順番がわかるような数値やテキストで入れて、
NSUserDefaultsにはその MSMutableArrayを保存し、起動時にはその情報を元に復帰させる
ようにしてみてはどうでしょうか?
あーまずいです。
アプリ終了時にはそれは呼ばれませんので、別のところで処理するようにしてください。
(iOS4なら applicationDidEnterBackgroundあたりいいんじゃないかと思いますが、その辺りは
仕様と要相談です)
あと、NSUserDefaultsに設定を行った後、synchronizeも呼んでおいてください。
NSUserDefaults Class Reference - synchronize
http://developer.apple.com/iphone/libra ... ynchronize
NSUserDefaults:synchronize
http://www.oomori.com/cocoafw/Foundatio ... onize.html
>[defaults setObject:tabBarController.viewControllers forKey:@"SETTINGS"];
基本的にこの NSUserDefaultsは設定値を記憶するもので、全てのオブジェクトのシリアライズを自動でやってくれる
ものではありません。
試してはいませんが、多分 tabBarController.viewControllersのままではうまくいかないと思います。
数値やテキスト、或いはそれらの入った配列オブジェクトなどで保存してください。
そうですね、MSMutableArrayに順番がわかるような数値やテキストで入れて、
NSUserDefaultsにはその MSMutableArrayを保存し、起動時にはその情報を元に復帰させる
ようにしてみてはどうでしょうか?
Re:iPhoneアプリ開発について
度々ありがとうございます。
質問ばかりで申し訳ないです><
>>試してはいませんが、多分 tabBarController.viewControllersのままではうまくいかないと思います。
中身を見るとそんな気がするのですが改善案がわかりません・・・。
Justyさんが言う通りUINavigationController(NSArray)が格納されていました。
ただ中身が0x?????? (?は数字) とメモリの番地?が入っている為、
次回では変わってしまいそうです・・・
Justy様から見たら初歩的な事の様な気がするのですが
調べてもわからないのでどうか改善案を教えては頂けないでしょうか?
>>MSMutableArrayに順番がわかるような数値やテキストで入れて、
for分で順番に値をセットしているのですが
defaultsをもって復元できるのでしょうか?
こちらもわからないです・・・
ソース
お手隙の時に回答頂けますと助かります。
質問ばかりで申し訳ないです><
>>試してはいませんが、多分 tabBarController.viewControllersのままではうまくいかないと思います。
中身を見るとそんな気がするのですが改善案がわかりません・・・。
Justyさんが言う通りUINavigationController(NSArray)が格納されていました。
ただ中身が0x?????? (?は数字) とメモリの番地?が入っている為、
次回では変わってしまいそうです・・・
Justy様から見たら初歩的な事の様な気がするのですが
調べてもわからないのでどうか改善案を教えては頂けないでしょうか?
>>MSMutableArrayに順番がわかるような数値やテキストで入れて、
for分で順番に値をセットしているのですが
defaultsをもって復元できるのでしょうか?
こちらもわからないです・・・
ソース
- (void)applicationDidEnterBackground:(UIApplication *)application { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:tabBarController.viewControllers forKey:@"SETTINGS"]; [defaults synchronize]; // NSLog( @"%@", [[tabBarController.viewControllers objectAtIndex:1] objectAtIndex:1]); NSMutableArray *setOrder= [[NSMutableArray alloc] init]; for( int i=0; i<[tabBarController.viewControllers count]; i++){ [setOrder addObject:[tabBarController.viewControllers objectAtIndex:i]]; } NSLog( @"%@", [tabBarController.viewControllers objectAtIndex:1] ); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ~略~ RootViewController *tableViewController; for(int i = 0; i <7; i++){ tableViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain]; tableViewController.rssURL = [rssURLArray objectAtIndex:i]; tableViewController.title = [tabBarTitleArray objectAtIndex:i]; navigationController = [[UINavigationController alloc] initWithRootViewController:tableViewControlle[/url]; navigationController.tabBarItem.title = [tabBarTitleArray objectAtIndex:i]; // navigationController.tabBarItem.image = [UIImage imageNamed:[tabBarIconArray objectAtIndex:i]]; [viewControllers addObject:navigationControlle[/url]; [tableViewController release]; [navigationController release]; } NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; if( [defaults objectForKey:@"SETTINGS"] != nil){ tabBarController.viewControllers = [defaults objectForKey:@"SETTINGS"]; } NSLog( @"%@", [defaults objectForKey:@"SETTINGS"]); tabBarController = [[UITabBarController alloc] init]; [tabBarController setViewControllers:viewControllers];長々とした質問で大変申し訳ないのですが
お手隙の時に回答頂けますと助かります。
Re:iPhoneアプリ開発について
>改善案
では手っ取り早い方法として、保存時にタブバーのタイトルを順番に保存してみてはどうでしょう。
[color=#d0d0ff" face="monospace]
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
const int arrayMaxNum = [tabBarController.viewControllers count];
NSMutableArray *titleArr = [[NSMutableArray alloc] initWithCapacity: arrayMaxNum];
for(int i=0; i<arrayMaxNum; ++i)
{
UINavigationController * nvc = [tabBarController.viewControllers objectAtIndex: i];
[titleArr addObject: nvc.tabBarItem.title];
[nvc release];
}
[defaults setObject:titleArr forKey:@"SETTINGS"];
[defaults synchronize];
[titleArr release];
[/color]
こんな感じでタブバーに表示されている名前が順番に "SETTINGS"に格納されることになります。
あとは起動時にこの情報を元に復元するだけとなります。
復元時には "SETTINGS"配列を頭から順番に中身の文字列を取り出し、[tabBarTitleArray indexOfObject:XXX]を使って
インデックスを求めれば、rssURLArrayや tabBarTitleArrayの何番目の要素を使えばいいのか求められるはずです。
では手っ取り早い方法として、保存時にタブバーのタイトルを順番に保存してみてはどうでしょう。
[color=#d0d0ff" face="monospace]
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
const int arrayMaxNum = [tabBarController.viewControllers count];
NSMutableArray *titleArr = [[NSMutableArray alloc] initWithCapacity: arrayMaxNum];
for(int i=0; i<arrayMaxNum; ++i)
{
UINavigationController * nvc = [tabBarController.viewControllers objectAtIndex: i];
[titleArr addObject: nvc.tabBarItem.title];
[nvc release];
}
[defaults setObject:titleArr forKey:@"SETTINGS"];
[defaults synchronize];
[titleArr release];
[/color]
こんな感じでタブバーに表示されている名前が順番に "SETTINGS"に格納されることになります。
あとは起動時にこの情報を元に復元するだけとなります。
復元時には "SETTINGS"配列を頭から順番に中身の文字列を取り出し、[tabBarTitleArray indexOfObject:XXX]を使って
インデックスを求めれば、rssURLArrayや tabBarTitleArrayの何番目の要素を使えばいいのか求められるはずです。
Re:iPhoneアプリ開発について
出来ました!!
お忙しいのにソースまで頼んでしまい申し訳ありませんでした。
Justy様のお陰で[defaults synchronize];をしなければならないことや
オブジェクトの扱い方が少しだけわかりました。
本当にありがとうございました!!
お忙しいのにソースまで頼んでしまい申し訳ありませんでした。
Justy様のお陰で[defaults synchronize];をしなければならないことや
オブジェクトの扱い方が少しだけわかりました。
本当にありがとうございました!!
メモリに画像を読み込む場合
LaodGraphを使用する際、例えば、
int img1 = LaodGraph ( "map.png" ) ;
という記述を、グローバル変数にすることはできないのでしょうか?
自分がやったところでは、グローバル変数にすると画像が表示されなかったので。
といいますか、DXライブラリの初期化コードよりも前に、画像ファイルのための変数宣言などは、してはいけないのかな~という気がしているのですが、どうなのでしょう。
文字列などはグローバル変数にしても表示されます。ただ、画像ファイルや音楽ファイルだと、WinMainより前に書くと表示や再生ができないのです。
int img1 = LaodGraph ( "map.png" ) ;
という記述を、グローバル変数にすることはできないのでしょうか?
自分がやったところでは、グローバル変数にすると画像が表示されなかったので。
といいますか、DXライブラリの初期化コードよりも前に、画像ファイルのための変数宣言などは、してはいけないのかな~という気がしているのですが、どうなのでしょう。
文字列などはグローバル変数にしても表示されます。ただ、画像ファイルや音楽ファイルだと、WinMainより前に書くと表示や再生ができないのです。
Re:メモリに画像を読み込む場合
変数の宣言はどこでも大丈夫ですよ
関数の呼び出しはDxLib_Initの後にしないとだめです
int img1;
DxLib_Init();
img1 = LaodGraph ( "map.png" ) ;
関数の呼び出しはDxLib_Initの後にしないとだめです
int img1;
DxLib_Init();
img1 = LaodGraph ( "map.png" ) ;
Re:メモリに画像を読み込む場合
グローバル変数にそのような代入は出来たとしてもしない方が良いと思います。
初期化やロードは専用の関数を作って処理させるべきです。
同じ処理を2回しなくてはならなくなったときや、
ゲームのリセットやリロードを実装したくなった時必ず困ると思いますので。
初期化やロードは専用の関数を作って処理させるべきです。
同じ処理を2回しなくてはならなくなったときや、
ゲームのリセットやリロードを実装したくなった時必ず困ると思いますので。
Re:メモリに画像を読み込む場合
>初期化やロードは専用の関数を作って処理させるべきです
まったくその通りですね。
そういう意味では再利用可能なグローバル変数だと初期化を忘れても前の値が残っていて
そのまま使えてしまうことが多いので、グローバル変数を使うのは本当に必要な最小限に留めるのが
いいかと思います。
まったくその通りですね。
そういう意味では再利用可能なグローバル変数だと初期化を忘れても前の値が残っていて
そのまま使えてしまうことが多いので、グローバル変数を使うのは本当に必要な最小限に留めるのが
いいかと思います。
Re:メモリに画像を読み込む場合
>宣言だけ書いて、DXライブラリを初期化してから、代入
>変数の宣言はどこでも大丈夫ですよ
>関数の呼び出しはDxLib_Initの後にしないとだめです
>int img1;
>DxLib_Init();
>img1 = LaodGraph ( "map.png" ) ;
なるほど、こういうやり方ならできるのですね。
>グローバル変数にそのような代入は出来たとしてもしない方が良いと思います。
>初期化やロードは専用の関数を作って処理させるべき
>グローバル変数を使うのは本当に必要な最小限に留める
とはいえ、あまりやらない方がよいのですね。
了解しました。大変助かりました。
皆さん、ご回答ありがとうございました。
>変数の宣言はどこでも大丈夫ですよ
>関数の呼び出しはDxLib_Initの後にしないとだめです
>int img1;
>DxLib_Init();
>img1 = LaodGraph ( "map.png" ) ;
なるほど、こういうやり方ならできるのですね。
>グローバル変数にそのような代入は出来たとしてもしない方が良いと思います。
>初期化やロードは専用の関数を作って処理させるべき
>グローバル変数を使うのは本当に必要な最小限に留める
とはいえ、あまりやらない方がよいのですね。
了解しました。大変助かりました。
皆さん、ご回答ありがとうございました。