2012年11月7日水曜日

データ保存 その2

つづき ちょこちょこと訂正を加えた。とりあえずUISegmentedControll(_timeSegmanet)を加えた。

- (void)save{
    
    NSMutableArray *myMuArray = [NSMutableArray array];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    
    // 保存されているデータがあるかないか判断
    if ([[[NSUserDefaults standardUserDefaults] arrayForKey:@"ARRAY"] count] > 0) {  // あれば呼び込む
        NSArray *array = [[NSUserDefaults standardUserDefaults] arrayForKey:@"ARRAY"];
        myMuArray = [[NSMutableArray alloc] initWithArray:array];
        NSLog(@"myMuArray is %@",[myMuArray description]);
    }
    
    //日時の書式を作成
    NSDate *nowDate = [NSDate date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy/MM/dd "];
    
    //日付型をString型にする
    NSString *dateString = [formatter stringFromDate:nowDate];

    if (_timeSegment.selectedSegmentIndex == 0) {
        [dict setValue:@"ASA" forKey:@"TIME"];

    }else if(_timeSegment.selectedSegmentIndex == 1){
        [dict setValue:@"HIRU" forKey:@"TIME"];
        
    }else if(_timeSegment.selectedSegmentIndex == 2){
        [dict setValue:@"YORU" forKey:@"TIME"];
    }
    [dict setValue:dateString forKey:@"DATE"];

    [dict setValue:hozontfd.text forKey:@"HINMOKU"];
    
    // 新しい値を配列に追加
    [myMuArray addObject:dict];
    // 値を保存
    [[NSUserDefaults standardUserDefaults] setObject:myMuArray forKey:@"ARRAY"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
myMuArrayの出力結果は、
myMuArray is (
         {
        DATE = "2012/11/07 ";
        HINMOKU = 77;
        TIME = ASA;
    },
        {
        DATE = "2012/11/07 ";
        HINMOKU = 7;
        TIME = ASA;
    },
        {
        DATE = "2012/11/07 ";
        HINMOKU = 733;
        TIME = YORU;
    }
)
出力結果の「\U5e」なんだ?と思ったら「年[スペース]」か。これはスラッシュでいいなぁと思い修正。 出力結果の構造的に理想とは違うのかな?

2012年11月6日火曜日

データ保存について

NSDictionaryとNSUserDefaultを使用してデータを保存します。

 目標

①日付、②品目数(朝or昼or夜)をセルのカスタマイズを使って表示させることです。
1、dictionary、NSUserDefaultsを使って
①日付
②品目数
③品目数
④品目数
を格納、保存
です。 現在の状況は、とりあえずコードベタ張りするとこんな感じ。
//seguの処理
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // 遷移先を取得
    if ([[segue identifier] isEqualToString:@"ponSegue"]) {
        
        TableViewController *tableViewController = segue.destinationViewController;
        
        //追加 日時の表記を変える
        //日時の書式を作成
        nowDate = [NSDate date];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy年 MM/dd "];  //HH:mm
        //日付型をString型にする
        NSString *dateString = [formatter stringFromDate:nowDate];
        
        // NSMutableArrayの生成
        NSMutableArray* myMuArray = [NSMutableArray array];
        //日付を入れる配列用意
        NSMutableArray* myDateString = [NSMutableArray array];
        
        
        // 保存されているデータがあるかないか判断
        if ([[[NSUserDefaults standardUserDefaults]
              arrayForKey:@"ARRAY"] count] > 0) {  // あれば呼び込む
            
            //NSarrayで取り出す (これじゃないとNSUserDefaultsから取り出せない)
            NSArray *array = [[NSUserDefaults standardUserDefaults]
                              arrayForKey:@"ARRAY"];
            
            //NSMutableArrayに格納
            myMuArray = [[NSMutableArray alloc] initWithArray:array];
            NSLog(@"myMuArray is %@",[myMuArray description]);
        }
        
        // 新しい値を配列に追加
        [myDateString addObject:dateString];
        [myMuArray addObject:hozontfd.text];
        
        //大きな配列全体の保存
        saveArray = [[NSMutableArray alloc] initWithCapacity:1];
        
        //dictionaryにそれぞれの要素を入れる
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:1];
        
        [dict setObject:myDateString forKey:@"Date"];
        [dict setObject:myMuArray forKey:@"MuArray"];
        //これでまとめて保存
        [saveArray addObject:dict];
        // 値を保存
        [[NSUserDefaults standardUserDefaults] setObject:saveArray forKey:@"ARRAY"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        
        tableViewController.myMuArray2 =saveArray;
        tableViewController.hinmoku = myMuArray;
        tableViewController.hiduke = myDateString;
        
    }
    
}

ふむ、、、おかしいですねー。 出力結果が、(朝1日分のみですが^^;;)
        {
        Date =         (
            "2012\U5e74 11/06 "
        );
        MuArray =         (
            12
        );
    }
)
思うようなデータが入ってないっすねー。 理想は、
{
Date = "日付"
 Asa = "数字"
 Hiru = "数字"
 Yoru = "数字"
},{
Date = "日付"
 Asa = "数字"
 Hiru = "数字"
 Yoru = "数字"
}

ですかねー。違うかもしれんけど^^;; 長くなったので次回

nested push animation can result in corrupted navigation bar


nested push animation can result in corrupted navigation bar

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

Unbalanced calls to begin/end appearance transitions for .

このエラーに引っかかった。 まぁそのままんまですが、解決するまですごく時間かかった。 こいつとかみたらいんですかねー。 で、どんな感じで書いてたかと

//ボタンを押したときの処理
- (IBAction)btnact:(id)sender {
     //seguのIDを設定 (送り先のViewに値を渡すため・・・)
    [self performSegueWithIdentifier:@"ponSegue" sender:self];
}

//seguの処理
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // 遷移先を取得
    if ([[segue identifier] isEqualToString:@"ponSegue"]) {
    }    
}

こういう感じです。違和感なかったです(汗)もちろん、storyboardの方も設定してますよ。 解決方法はというと、

//ボタンを押したときの処理
- (IBAction)btnact:(id)sender {

// ここいらない
}

//seguの処理
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // 遷移先を取得
    if ([[segue identifier] isEqualToString:@"ponSegue"]) {
    }    
}

以上でーす。 おそらくボタンからの画面遷移をstoryboardで設定してたからでしょうね(伝わってる??)

2012年11月5日月曜日


とりあえず簡単なのでデータをNSUserdDefaultsで保存する。

参考URLは下記
NSUserDefaultsはどこまで保存できるかチェック(1)
http://iphone-dev.g.hatena.ne.jp/tokorom/20090520/1242789479

画面遷移するときに保存させればいいかなと
//seguの処理 
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // 遷移先を取得     if ([[segue identifier] isEqualToString:@"ponSegue"]) {      
        TableViewController *tableViewController = segue.destinationViewController;
        tableViewController.kazu = hozontfd.text//テキストフィールドに書かれた値をkazu       // tableViewController.myMuArray = array;     // NSMutableArrayの生成         NSMutableArray* myMuArray = [NSMutableArray array];         // 保存されているデータがあるかないか判断
        if ([[[NSUserDefaults standardUserDefaults] arrayForKey:@"ARRAY"] count] == 0) {             // あれば呼び込む            NSArray *array = [[NSUserDefaults standardUserDefaults] arrayForKey:@"ARRAY"];            // NSMutableArrayに格納            myMuArray = [[NSMutableArray alloc] initWithArray:array];   NSLog(@"myMuArray is %@",[myMuArray description]);
        }
   
        // 新しい値を配列に追加        [myMuArray addObject:hozontfd.text] // 値を保存        [[NSUserDefaults standardUserDefaults] setObject:myMuArray forKey:@"ARRAY"];         [[NSUserDefaults standardUserDefaults] synchronize];   
    }
  
}


注意しなければいけないところは、
NSUserDefaultsではNSMutableArrayを取り出せないこと。そもそもこんな感じで活用することを想定していないからかなー。
取り出そうとするとこんなかんじのエラーが、、、
mutating method sent to immutable object

だからNSArrayで呼び込んで、NSMutableArrayに格納し直すという手間がかかる。