1

NSMutableArray次のコードでこの行を追加すると、ルートディクショナリの行を含むplistがアプリにあります。

NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]];
[badgeArray addObject:item];

それは私にスクランブルされたソートされた配列を与えます...私はそれを同じ順序にしたかった...それらの行のキーが(item1、item2、item3 ...、etc)と呼ばれることを念頭に置いて...

どのように修正する必要がありますか?

4

4 に答える 4

2

tableViewの場合:cellForRowAtIndexPath:この方法でオブジェクトにアクセスできます

NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]];

これは、plistが小さい場合に適しています。そうでない場合は、メンバー変数にキーの順序を保存します。

于 2012-10-21T10:43:44.203 に答える
1

tableView:cellForRowAtIndexPath:新しいセルが必要なとき、つまりUITableView初めて入力するとき、およびスクロール時にセルが表示されるときはいつでも呼び出されることを考慮してください。したがって、この方法でデータソースにデータを入力することはお勧めできません。

にデータを入力することをお勧めしますviewDidLoadUITableView何らかの方法で含まれている情報を更新する必要がある場合は、そのためのメソッドを作成し、更新が行われる場所から呼び出しますviewDidLoad(たとえば、ボタンを押して、プルして更新する場合など)。

于 2012-10-21T10:31:31.000 に答える
1

このコードをcellForRowAtIndexPathではなくviewDidLoadメソッドに移動することをお勧めします。reloadRowsAtIndexPathsなどのメソッドを呼び出すと、badgeArrayがインスタンス変数である場合に順序が崩れる可能性があります。さらに、すべての行が完全に満たされているわけではないため、配列全体を埋めることができない場合があります。一度に画面に表示されます。

あなたのアプローチは効率的ではないようです。BadgeDictが変更される可能性がある場合は、通知を実装してみてください。UIViewControllerをオブザーバーとしてbadgeDictの変更に追加し、そのようなイベントが発生した場合は、badgeArrayをリロードするだけです。

そうするために:

  • viewControllerのviewDidLoadに次を追加します。

    [[NSNotificationCenter defaultCenter] addObserver:selfセレクター:@selector(refreshBadgeArray :) name:@ "BadgeChanged" object:nil];

  • viewControllerのdeallocに次を追加します。

    [[NSNotificationCenter defaultCenter] removeObserver:self];

  • BadgeDictが変更された場所:

    [[NSNotificationCenter defaultCenter] postNotificationName:@ "BadgeChanged" object:self];

于 2012-10-21T10:43:24.220 に答える
1

はい、コードはcellForRowAtIndexPathにあるため、スクランブルされます。

UITableViewCellsはキャッシュされます。関連する周囲のコードを表示しなかったため、キャッシュされたセルを再表示している可能性があります。

于 2012-10-21T11:26:00.543 に答える