2012-04-21 4 views
0

こんにちは私は2つのカスタムUITableViewCellのペン先を持っている、と私は設定で選択したペン先の種類を選択するユーザーに選択肢を与え、私はこのようにカスタムビューのセルを初期化します。リロードペン先

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

static NSString *CellIdentifier = @"MasterViewCell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:[[NSUserDefaults standardUserDefaults] valueForKey:@"CustomCellViewKey"] owner:self options:nil]; 

    cell = customCell; 
    self.customCell = nil; 

} 

return cell; 
} 

私はあなたのNSUserDefaultsには、xibの名前ですが、私は私のビューに戻ったときに、セルの表示は変更されていないと私は、アプリケーションをバックグラウンドから閉じて、再び開いて、新しいビューをロードするので、アプリケーションを終了せずにビューをリロードする方法がありますか?

+0

選択した後にtableViewのデータをリロードしますか? – jmstone617

+0

はい私は行う[self.tableview reloadData]; viewwillappearでは、しかし、動作しません... – Piero

答えて

2

NSUserDefaultsの仕組みは、setValue:forKey:(または他のsetterの便利なメソッドの1つ)を使用しても、実際にすぐに書き出されるわけではありません。 OSは、一定時間が経過した後、アプリケーションが終了するなどして、そのplistの保存を最適化しようとします。その時間より前に設定した値は、OSを開いたり閉じたりしないように単にキャッシュされます。データベースを何度も。したがって、セルの値を取得しようとすると、データベースに行き、古い値である可能性があるものを取得します。アプリを終了すると、NSUserDefaultsは設定した新しい値を書き出し、戻ってくると正しい値を取得します。

NSUserDefaultsがすぐにデータベースに書き込むようにするには、ユーザーの入力に基づいて値を設定した直後にsynchronizeを呼び出してみてください。これはデータベースに書き出すので、valueForKey:メソッドを呼び出すときに正しいものを取得する必要があります。

更新:このメソッドの論理フローも再構成します。まず、2つの異なるペン先から2つのセルをアンロードする場合、2つの異なる再利用識別子が必要です。さもなければ、あなたのテーブルビューは、実際にcell2を必要とするときにcell1の再利用を探しています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *nibName = [[NSUserDefaults standardUserDefaults] valueForKey:@"CustomCellViewKey"]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nibName]; 

    if (!cell) { 
     NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; 
     for (id obj in nibArray) { 
      if ([obj isKindOfClass:[UITableViewCell class]]) { 
       cell = obj; 
       break; 
      } 
     } 
    } 
} 
+0

答えに感謝、私はこれを試してみました:[[NSUserDefaults standardUserDefaults] synchronize];ユーザーが選択を取ったときにテーブルビューに戻っても何も変わらない... – Piero

+0

私は問題があると思います。このステートメントに(セル== nil)と入力しないでください。 ... – Piero

+0

私はこれだけ行います:UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:[[NSUserDefaults standardUserDefaults] valueForKey:@ "iEpisodeSettingViewCell"]]; viewwillappearメソッドのデータをリロードして、今度は新しいセル識別子を認識するようになりました! – Piero