2010-05-17 5 views
2

J'ai eu ce genre de problème avant, et il n'a pas obtenu une réponse satisfaisante.NSMutableArray ne peut pas être ajouté à

J'ai un viewcontroller avec une propriété appelée "counties" qui est un NSMutableArray. Je vais explorer un écran de navigation pour voir les comtés pour une recherche géographique. Ainsi, la page de recherche descend jusqu'à la page "Sélectionner les pays".

Je passe NSMutableArray *counties au second contrôleur lorsque je pousse le second sur la pile de navigation. En fait, je place la propriété "selectedCounties" de ce second contrôleur (également un NSMutableArray) avec un pointeur sur les "comtés" de mon premier contrôleur, comme vous le verrez ci-dessous.

Quand je vais à addObject que, bien que, je reçois ceci:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object' 

Voici mon code:

dans SearchViewController.h:

@interface SearchViewController : UIViewController 
{ 
    .... 
    NSMutableArray *counties; 
} 

.... 
@property (nonatomic, retain) NSMutableArray *counties; 

dans SearchViewController.m:

- (void)getLocationsView 
{ 
    [keywordField resignFirstResponder]; 
    SearchLocationsViewController *locationsController = 
      [[SearchLocationsViewController alloc] initWithNibName:@"SearchLocationsView" bundle:nil]; 
    [self.navigationController pushViewController:locationsController animated:YES]; 
    [locationsController setSelectedCounties:self.counties]; 
    [locationsController release]; 
} 

dans SearchLocationsViewController.h:

@interface EventsSearchLocationsViewController : UIViewController 
    <UITableViewDelegate, UITableViewDataSource> 
{ 
    ... 
    NSMutableArray *selectedCounties; 

} 

... 
@property (nonatomic, retain) NSMutableArray *selectedCounties; 

dans SearchLocationsViewController.m (le point est ici, nous sommes affin de chaque élément d'une table étant actif ou non dans la liste des comtés sélectionnés):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([self.selectedCounties containsObject:[self.counties objectAtIndex:indexPath.row]]) { 
     //we're deselcting! 
     [self.selectedCounties removeObject:[self.counties objectAtIndex:indexPath.row]]; 
     cell.accessoryView = [[UIImageView alloc] 
           initWithImage:[UIImage imageNamed:@"red_check_inactive.png"]]; 
    } 
    else { 
     [self.selectedCounties addObject:[self.counties objectAtIndex:indexPath.row]]; 
     cell.accessoryView = [[UIImageView alloc] 
           initWithImage:[UIImage imageNamed:@"red_check_active.png"]]; 
    } 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Nous mourons à [self.selectedCounties addObject.... là. Maintenant, quand je me NSLog [self.selectedCounties class], il me dit que c'est un NSCFArray.

Comment cela se produit-il? Je comprends les bundles de classe (ou je pense que je le fais de toute façon), mais il s'agit explicitement d'un type spécifique, et il est en train de perdre le sous-classement à un moment donné d'une manière qui tue le tout. Je ne comprends tout simplement pas pourquoi cela arriverait.

+0

Comment pouvez-vous créer votre counti es objet? – Vladimir

+0

Où avez-vous assigné 'counties'? – kennytm

Répondre

4

Je suppose que vous n'êtes pas l'allocation du tableau correctement (par exemple, NSMutableArray *arr = [[NSArray alloc] init] ou assignez une NSArray à la variable NSMutableArray. Pouvez-vous poster le code où vous initialisez le tableau?

+1

Culpabilité comme accusée: 'self.counties = [[NSArray alloc] initWithObjects: @" Emplacement actuel ", nil];' Laissez-moi résoudre ce problème et voir si les choses fonctionnent soudainement. –

+0

Bingo. Le problème était, je me suis rendu compte que j'étais en train de coder que je devais être Mutable, et je ne suis pas retourné le réparer partout où il fallait réparer, je suppose. Je viens de langues où les choses sont déjà mutables, donc cette distinction n'est pas encore naturelle pour moi. MERCI!! –

1

Où avez-vous init ? l'objet que vous définissez comme comtés peut-être que tu as fait une erreur comme:

NSMutableArray *counties = [[NSMutableArray alloc] init]; 

Dans ce cas, aucune erreur de compilation s'affiche, mais vous ne pouvez pas prendre des changements sur un tableau créé comme

+0

Merci - @ eman vous a battu d'une minute ou deux, mais c'est la bonne réponse. –

Questions connexes