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;
}

ご覧のとおり、ユーザーの選択を xib の名前である NSUserDefaults に保存しますが、ビューに戻ると、セル ビューは変更されず、アプリケーションを終了し、アプリを閉じる必要があります。バックグラウンドを開き、それを再度開くと、新しいビューが読み込まれるので、アプリケーションを終了せずにビューをリロードする方法はありますか?

4

1 に答える 1

2

したがって、NSUserDefaults の動作方法は、setValue:forKey: (または他のセッターの便利なメソッドの 1 つ) を使用しても、実際にはすぐに書き出されないということです。OS は、アプリが終了したときなど、一定の時間が経過した後にのみ、その plist の保存を最適化しようとします。それ以前は、OS がファイルを開いたり閉じたりする必要がないように、設定した値が単純にキャッシュされます。何度もデータベース。したがって、セルの値を取得しようとすると、データベースに送られ、古い値である可能性があるものが取得されます。アプリを終了すると、設定した新しい値が NSUserDefaults によって書き出され、戻ったときにその正しい値が取得されます。

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

更新:このメソッドの論理フローも再構築します。まず、2 つの異なるニブから 2 つのセルをアンロードする場合、2 つの異なる再利用識別子が必要です。そうしないと、セル 2 が本当に必要なときに、テーブルビューが再利用するセル 1 を探し出します。次のようなことを試してください:

- (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;
            }
        }
    }
}
于 2012-04-21T23:18:12.523 に答える