2013-05-14 3 views
0

Ce que je suis en train de réaliser:Comment créer un tableau de taille dynamique

J'ai un UITableView et je veux vérifier si la table a été sélectionné ou non et garder dans un tableau facile d'accès OUI ou NO valeurs qui correspondent à cette ligne afin que je puisse ensuite manipuler les données.

mon code comme suit

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

Comme il se distingue je peux créer un BOOL selected[some value] mais mon problème est que l'indice maximum nécessaire pour moi est inconnu ma taille table change constamment. ainsi la définition de l'index maximum me limite.

Je suis nouveau à l'objectif C et je viens d'un fond PHP donc je ne sais pas s'il est possible de créer un tableau qui fait ce que je veux faire dans l'objectif-c.

Sinon, quelles seraient mes options dans l'objectif-c pour avoir un moyen facile d'écrire/lire facilement selected[row] = YES/NO.

je besoin d'un moyen d'écrire OUI/NON et le relier au indexpath.row

+0

Avez-vous envisagé d'obtenir le chemin d'index sélectionné lorsque vous en avez besoin? –

+0

@MarcusAdams Permet de sélectionner plusieurs lignes, pas seulement une ligne. – rmaddy

Répondre

5

Utilisez un NSMutableSet et stocker le NSIndexPath des lignes sélectionnées. Si vous sélectionnez une ligne, vous ajoutez le chemin d'accès à l'ensemble. Si vous désélectionnez une ligne, supprimez le chemin de l'ensemble.

Pour voir si une ligne est sélectionnée, voir si l'indexPath est dans l'ensemble ou non.

BTW - cela ne fonctionne que si les lignes sont fixes. Si l'utilisateur peut ajouter, supprimer ou réorganiser des lignes, cette approche ne fonctionnera pas. Dans ce cas, vous devez stocker les clés de données, pas les chemins d'index.

Créer un ivar de type NSMutableSet. Appelons-selectedRows:

selectedRows = [[NSMutableSet alloc] init]; 

Puis, en didSelectRow vous:

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

Dans votre méthode cellForRow... vous faire quelque chose de similaire:

BOOL selected = [selectedRows containsObject:indexPath]; 
cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; 
+0

Merci! pourriez-vous me donner un petit exemple s'il vous plaît? Je n'ai jamais utilisé de sets –

+0

Voir ma mise à jour. – rmaddy

+0

J'ai juste essayé d'ajouter un NSLog (@ "% @", selectedRows); à la fin de cette fonction pour voir ce qu'il lance et il lance toujours –

1

Il suffit d'utiliser

NSMutableArray *dynamicArray = [NSMutableArray array]; 

Vous pouvez ajouter et supprimer des objets à volonté. Assurez-vous simplement d'utiliser l'emballage NSNumber pour ajouter des primitives:

[dynamicArray addObject:[NSNumber numberWithInt:indexNumber]]; 
// or 
[dynamicArray addObject:@(indexNumber)]; 
+0

J'ai toujours besoin du BOOL et je suppose que si j'utilise un NSMutableArray, je ne pourrai pas avoir les deux associés, je ferais mieux d'utiliser un dictionnaire. –

+0

Vous pouvez également ajouter BOOLs comme ceci 'addObject: @ YES' – Mundi

+0

mais alors j'aurais dynamicArray {indexNumber, BOOL, indexNumber, BOOL,} et il ne serait pas associé. dynamicArray {indexNumber => BOOL} –

0

Lorsque ce dont vous avez besoin est un tableau de longueur variable des valeurs booléennes, vous pouvez utiliser CFBitVectorRef. Cela consomme beaucoup moins de mémoire que d'utiliser une collection Cocoa conçue pour les valeurs d'objet objc (à condition bien sûr que ce tableau ait beaucoup d'éléments) car il consomme 1 bit pour chaque valeur, plutôt qu'un pointeur complet qui pointe vers un objet compté de référence alloué dynamiquement .

1

Au lieu d'un tableau, vous pouvez utiliser un ensemble d'index.

@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]; 
    } 
} 
+0

Cette approche ne fonctionne que si la table a une section. – rmaddy

+0

n'hésitez pas à ajouter un tableau d'ensembles d'index, un pour chaque section. – vikingosegundo

Questions connexes