0

tableView があり、行の indexPath を配列に追加してからチェックマークを追加することで、どの行が選択されたかを追跡しています。

cellForRowAtIndexPath メソッドでこのコードを使用してその配列を繰り返し処理していますが、魅力的に機能します。

for (NSIndexPath * element in indexArray)
    if ([indexPath compare:element] == NSOrderedSame) { 
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

ただし、その行の値も取得して、他の目的のために別の配列に入れています。どちらの場合もこの 2 番目の配列を使用すれば、コードを単純化できると考えましたが、上記のコードをどのように書き直すかわかりません。概念はわかりましたが、上記のコードは indexPath 比較を使用しているため、文字列を配列と比較する必要があります。

変更方法がわからないのは、その「if」行です。

for (NSString *element in valueArray) {
    if ([indexPath compare:element] == NSOrderedSame) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
}  

考え?ありがとう。

詳細情報を編集

私の配列には、変更されない 400 の一意の項目が含まれています。それらの indexPath を配列に追加し、それを繰り返してチェックマークを追加するとうまくいきます。代わりに配列の文字列値を使用して繰り返したい理由は、tableView に searchBar を追加したいからです。

その searchBar を追加した後、検索を行うと、searchResultsTableView は 400 の一意のアイテムをその検索に一致するいくつかのアイテムに切り詰めます。ここで、検索で返された最初の行を選択するとします。コードは、チェックマークを追跡するために、その行の indexPath を indexArray に追加します。インデックス 0,0 を追加します。

しかし、検索モードをキャンセルすると、searchResultsTableView で 0,0 を選択したため、最初の行 0,0 が tableView でチェックされます。私がどこに行くのか分かりますか?したがって、この問題を軽減するために、 indexPath の代わりに行の文字列を追跡することを考えました。

もっとはっきり?

4

2 に答える 2

0

テーブルビューのデータソースとして、(可変の)ディクショナリの配列を使用できます。各ディクショナリには、1行のテキスト値と選択状態(as NSNumber)が含まれています。(ここでは、テーブルビューにセクションが1つしかないことを前提としています)。

その後、cellForRowAtIndexPathあなたは次のようなことをすることができます

NSDictionary *d = [dataArray objectAtIndex:indexPath.row];
NSString *value = [d objectForKey:@"value"];
BOOL selected = [[d objectForKey:@"selected"] boolValue];

それに応じて、セルのコンテンツとアクセサリの種類を設定します。

選択状態を変更するには:

NSDictionary *d = [dataArray objectAtIndex:indexPath.row];
BOOL selected = [[d objectForKey:@"selected"] boolValue];
[d setObject:[NSNumber numberWithBool:!selected] forKey:@"selected"];

次に、検索のために、その配列のフィルター処理されたサブセットを作成します。ただし、フィルター処理された配列は同じ辞書を参照するため、検索テキストを変更したり検索を終了したりしても、各エントリの選択状態は保持されます。

もちろん、検索がアクティブな場合は、上記のメソッドでフィルター処理された配列を使用する必要があります。

于 2012-10-23T16:37:57.433 に答える
0

文字列値とインデックス値の両方で ac 構造体を作成し、これを NSValue オブジェクトにラップしてから、そのオブジェクトを NSArray? 次に、for() ループと if() 句を変更して、NSValue? 構造体を NSObject にラップする方法を参照してください。

于 2012-10-23T15:48:51.877 に答える