0

以前は、テーブルビューに表示されている大きなデータセット(〜530レコード)がありました。データは、IDと名前の2つのキーを持つ辞書の配列に保持されていました。以前、セルをタップし、チェックマークを追加して、セルの行番号を「selectedArray」に送信しました。すでにアルファベット順に並べ替えているので(まだ1つのセクションにあります)、selectedArrayに格納されているindexPath.rowは辞書の配列インデックスに対応しており、レコードからデータ(ID)を取得できました。

私はこれをアルファベット順にヘッダーに分割することにしました(これは絶対的な苦痛でした。レコードのリストにヘッダーを挿入するのがなぜこれほど複雑なプロセスなのかわかりません)。ただし、indexPath.rowのみを使用したため、最初のレコードにチェックマークを付けると、各セクションの最初のレコードにチェックマークが付けられ、数値0のみが返されるため、データセット全体の最初のレコードのみが取得されます。これを修正する簡単な方法はありますか?本当に助けてくれてありがとう。

cellForRowAtIndexPath:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"inviteCell"];

//    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }


//    NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row];


    //---get the letter in the current section---
    NSString *alphabet = [nameIndex objectAtIndex:[indexPath section]];
    //---get all states beginning with the letter---
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF.name beginswith[c] %@", alphabet];
    NSArray *states = [sortedFriendsArray filteredArrayUsingPredicate:predicate];
    if ([states count]>0) {
//---extract the relevant state from the states object---

        NSDictionary *friend = [states objectAtIndex:indexPath.row];
        long long fbid = [[friend objectForKey:@"id"]longLongValue];
        NSString *name = [friend objectForKey:@"name"];

        NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%qi/picture?type=square",fbid];
        NSURL *url = [NSURL URLWithString:urlString];

        UILabel *eventNameLabel = (UILabel *) [cell viewWithTag:1];
        eventNameLabel.text = name;

        UIImageView *eventLogo = (UIImageView*) [cell viewWithTag:2];
        eventLogo.image = [UIImage imageNamed:@"112-group.png"];
        //    eventLogo.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];;

    }

        return cell;

}

現在のdidSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSNumber *indexNumber = [NSNumber numberWithInt:indexPath.row];
    NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row];
    long long fbid = [[friend objectForKey:@"id"]longLongValue];
    NSNumber *fbidNum = [NSNumber numberWithLongLong:fbid];

    if ([checkedCells objectForKey:indexNumber] != nil) {
        [checkedCells removeObjectForKey:indexNumber];
        cell.accessoryType = UITableViewCellAccessoryNone;

    }
    else
    {
        [checkedCells setObject:fbidNum forKey:indexNumber];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }


    NSLog(@"Cell Pressed: %@",indexNumber);
    NSLog(@"FBID: %lld",fbid);
    NSLog(@"Array: %@",checkedCells);
}
4

1 に答える 1

0

チェックしたセルをセクションや行ではなく、行ごとに保存しているようです。少なくとも、このコード ブロックのセクションと行をテストする必要はありませんか?

if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType = UITableViewCellAccessoryNone;
}

遅くなり、このコードを試すのに Mac が手元にないので、明らかな何かが欠けている可能性があります。ゼロを返すだけのことを言っているのかわかりません...それはindexPath.rowですか?

編集:

データ配列のセクションを説明するために、データを配列の辞書として格納することをお勧めします。1 つの辞書エントリは各文字でキー付けされ、内側の配列はその文字で始まるすべてのエントリを保持します。データを取得するのはもう少し複雑ですが、セクションを正しく説明しています。

各セクションのエントリ数を考慮して何らかのオフセットを作成し、それを使用してフラットな配列にインデックスを付けることができると思いましたが、私の見解では、それを維持するのははるかに困難です。配列の辞書が最適だと思います。

于 2012-05-28T03:28:15.587 に答える