0

私が達成しようとしていること:

UITableView があり、テーブルが選択されているかどうかを確認し、その行に対応する YES または NO の値に簡単にアクセスできるように配列に保持して、後でデータを操作できるようにしたいと考えています。

次のように私のコード

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellLabelText = cell.textLabel.text;

    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        selected[row] = NO;
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        selected[row] = YES;
    }  
}

目立つように作成できますBOOL selected[some value]が、私の問題は、テーブルのサイズが絶えず変化するため、必要な最大インデックスが不明であることです。したがって、最大インデックスを設定すると制限されます。

私はObjective Cを初めて使用し、PHPのバックグラウンドを持っているため、Objective-Cでやりたいことを行う配列を作成できるかどうかわかりません。

それ以外の場合、objective-c 内で簡単に書き込み/読み取りを行うための私のオプションは何でしょうか selected[row] = YES/NO

YES/NO を記述して indexpath.row にリンクする方法が必要です

4

4 に答える 4

5

を使用して、選択した行NSMutableSetを保存します。NSIndexPath行を選択すると、パスがセットに追加されます。行の選択を解除する場合は、セットからパスを削除します。

行が選択されているかどうかを確認するには、indexPath がセット内にあるかどうかを確認します。

ところで-これは、行が固定されている場合にのみ機能します。ユーザーが行を追加、削除、または並べ替えることができる場合、このアプローチは機能しません。このような場合、インデックス パスではなく、データ キーを格納する必要があります。

type の ivar を作成しますNSMutableSet。それを呼びましょうselectedRows

selectedRows = [[NSMutableSet alloc] init];

次に、次のdidSelectRowことを行います。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    BOOL selected = [selectedRows containsObject:indexPath];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellLabelText = cell.textLabel.text;

    if (selected) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [selectedRows removeObject:indexPath];
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [selectedRows addObject:indexPath];
    }  
}

あなたのcellForRow...方法では、似たようなことをします:

BOOL selected = [selectedRows containsObject:indexPath];
cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
于 2013-05-14T19:28:03.647 に答える
1

使うだけ

NSMutableArray *dynamicArray = [NSMutableArray array]; 

これから自由にオブジェクトを追加および削除できます。必ずNSNumberラッパーを使用してプリミティブを追加してください。

[dynamicArray addObject:[NSNumber numberWithInt:indexNumber]];
// or
[dynamicArray addObject:@(indexNumber)];
于 2013-05-14T19:29:20.990 に答える
1

配列の代わりに、インデックス セットを使用できます。

@property (nonatomic,strong) NSMutableIndexSet *pickedIndexPaths;

- (void)viewDidLoad
{
    _pickedSIndexPaths = [[NSMutableIndexSet alloc] init];
    [super viewDidLoad];
}


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

    if(indexPath.section == 0) {
        cell.textLabel.text = self.sports[indexPath.row][@"sport"][@"name"];
        if ([_pickedIndexPaths containsIndex:indexPath.row]) {
            [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
        } else {
            [cell setAccessoryType:UITableViewCellAccessoryNone];
        }
    }
    return cell;
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([_pickedIndexPaths containsIndex:indexPath.row]) {
        [_pickedIndexPaths removeIndex:indexPath.row];
    } else {
        [_pickedIndexPaths addIndex:indexPath.row];
    }
    [tableView reloadData];
    }
}
于 2013-05-14T19:44:02.127 に答える
0

ブール値の可変長配列が必要な場合は、 を使用できますCFBitVectorRef。これは、objc オブジェクト値用に設計された Cocoa コレクションを使用するよりもはるかに少ないメモリを消費します (もちろん、配列に多くの要素がある場合)。これは、個々の動的に割り当てられた参照カウント オブジェクトを指す完全なポインターではなく、値ごとに 1 ビットを消費するためです。 .

于 2013-05-14T19:42:45.713 に答える