iPhoneアプリ開発について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ソラ

iPhoneアプリ開発について

#1

投稿記事 by ソラ » 15年前

以前、こちらのサイトでiPhone開発の質問をしていた方が
いましたのでつられて質問させて頂きました。

【参考URL】http://itpro.nikkeibp.co.jp/article/COL ... ST=develop
上のサイトを見ながらタブバー(下の黒いバー)を実装しました。
タブバーに5つ以上の要素があるとMore~と表示されて
タブバーの順番を入れ替えられることが出来るようになると思います。
アプリを終了してもこのタブの順番を保持しとく方法はないでしょうか?

Justy

Re:iPhoneアプリ開発について

#2

投稿記事 by Justy » 15年前

 NSUserDefaultsでアプリ終了時などのイベントでその順番を覚えておき、起動時に復元すればいいかと。


NSUserDefaultsでのデータ保存-CS193P | seiji blog
http://blog.seiji.me/320.html

NSUserDefaults Class Reference
http://developer.apple.com/iphone/libra ... rence.html

ソラ

Re:iPhoneアプリ開発について

#3

投稿記事 by ソラ » 15年前

>>Justy様
参考になるサイトをありがとうございます。

>>その順番を覚えておき、起動時に復元すればいいかと
すみません・・・ちゃんと書いておりませんでした。
この順番の取得の仕方がわかりません。
調べてみたのですがそれらしい記事がなくて・・・

Justy

Re:iPhoneアプリ開発について

#4

投稿記事 by Justy » 15年前

>この順番の取得の仕方がわかりません
 その記事で言うと tabBarController.viewControllersに順番通りに UINavigationControllerが格納されています(NSArray)。
 タブバーの入れ替えをおこなうとこの中の順番が入れ替わりますので、これを調べれば
どの UINavigationControllerがどの順番で並んでいるかわかるはずです。

http://developer.apple.com/iphone/libra ... ontrollers

ソラ

Re:iPhoneアプリ開発について

#5

投稿記事 by ソラ » 15年前

>>Justy様
参考になるサイトをありがとうございます!!
ただ私では閲覧しただけでは解決することが出来ませんでした・・・

見てみると値が変動しないと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];
}

Justy

Re:iPhoneアプリ開発について

#6

投稿記事 by Justy » 15年前

> (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を保存し、起動時にはその情報を元に復帰させる
ようにしてみてはどうでしょうか?

ソラ

Re:iPhoneアプリ開発について

#7

投稿記事 by ソラ » 15年前

度々ありがとうございます。
質問ばかりで申し訳ないです><

>>試してはいませんが、多分 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];
長々とした質問で大変申し訳ないのですが
お手隙の時に回答頂けますと助かります。

Justy

Re:iPhoneアプリ開発について

#8

投稿記事 by Justy » 15年前

>改善案
 では手っ取り早い方法として、保存時にタブバーのタイトルを順番に保存してみてはどうでしょう。

[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アプリ開発について

#9

投稿記事 by ソラ » 15年前

出来ました!!
お忙しいのにソースまで頼んでしまい申し訳ありませんでした。
Justy様のお陰で[defaults synchronize];をしなければならないことや
オブジェクトの扱い方が少しだけわかりました。
本当にありがとうございました!!

ネス

メモリに画像を読み込む場合

#10

投稿記事 by ネス » 15年前

LaodGraphを使用する際、例えば、

int img1 = LaodGraph ( "map.png" ) ;

という記述を、グローバル変数にすることはできないのでしょうか?
自分がやったところでは、グローバル変数にすると画像が表示されなかったので。

といいますか、DXライブラリの初期化コードよりも前に、画像ファイルのための変数宣言などは、してはいけないのかな~という気がしているのですが、どうなのでしょう。
文字列などはグローバル変数にしても表示されます。ただ、画像ファイルや音楽ファイルだと、WinMainより前に書くと表示や再生ができないのです。

シエル

Re:メモリに画像を読み込む場合

#11

投稿記事 by シエル » 15年前

できないでしょう。
宣言だけ書いて、DXライブラリを初期化してから、代入すれば問題ないのでは?

※間違ってたらすいませn。

toyo

Re:メモリに画像を読み込む場合

#12

投稿記事 by toyo » 15年前

変数の宣言はどこでも大丈夫ですよ
関数の呼び出しはDxLib_Initの後にしないとだめです
int img1;
DxLib_Init();
img1 = LaodGraph ( "map.png" ) ;

Dixq (管理人)

Re:メモリに画像を読み込む場合

#13

投稿記事 by Dixq (管理人) » 15年前

グローバル変数にそのような代入は出来たとしてもしない方が良いと思います。
初期化やロードは専用の関数を作って処理させるべきです。
同じ処理を2回しなくてはならなくなったときや、
ゲームのリセットやリロードを実装したくなった時必ず困ると思いますので。

Justy

Re:メモリに画像を読み込む場合

#14

投稿記事 by Justy » 15年前

>初期化やロードは専用の関数を作って処理させるべきです
 まったくその通りですね。
 そういう意味では再利用可能なグローバル変数だと初期化を忘れても前の値が残っていて
そのまま使えてしまうことが多いので、グローバル変数を使うのは本当に必要な最小限に留めるのが
いいかと思います。

ネス

Re:メモリに画像を読み込む場合

#15

投稿記事 by ネス » 15年前

>宣言だけ書いて、DXライブラリを初期化してから、代入
>変数の宣言はどこでも大丈夫ですよ
>関数の呼び出しはDxLib_Initの後にしないとだめです
>int img1;
>DxLib_Init();
>img1 = LaodGraph ( "map.png" ) ;
なるほど、こういうやり方ならできるのですね。


>グローバル変数にそのような代入は出来たとしてもしない方が良いと思います。
>初期化やロードは専用の関数を作って処理させるべき
>グローバル変数を使うのは本当に必要な最小限に留める
とはいえ、あまりやらない方がよいのですね。

了解しました。大変助かりました。
皆さん、ご回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る