Question

J'ai eu ce genre de problème avant, et il n'a pas obtenu une réponse satisfaisante.

J'ai un viewcontroller avec une propriété appelée « comtés » qui est un NSMutableArray. Je vais forer vers le bas d'un écran de navigation à vue qui est sur la sélection des comtés pour une recherche géographique. Ainsi, les exercices de la page de recherche vers le bas sur la page « sélectionner des comtés ».

I passe NSMutableArray *counties au second contrôleur comme je pousse le second sur la pile de navigation. En fait, je mets que la propriété « selectedCounties » de second contrôleur (également un NSMutableArray) avec un pointeur vers mon premier contrôleur « comtés », 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:

SearchViewController.h:

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

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

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

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 qu'il est un NSCFArray.

Comment cela se produit? Je comprends à propos de faisceaux de classe (ou je pense que je fais de toute façon), mais cela est explicitement un type spécifique, et il perdre le sous-classement à un moment donné d'une manière qui tue la chose. Je viens de complètement ne comprends pas pourquoi cela se passerait-il.

Était-ce utile?

La solution

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

Autres conseils

Où avez-vous l'objet que vous init défini comme comtés? Peut-être vous avez fait une erreur comme:

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

Dans ce cas, l'erreur ne compilation pop up, mais vous ne pouvez pas prendre des changements sur un tableau créé comme ça!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top