Domanda

Ho avuto questo tipo di problema prima, e non ha ottenuto una risposta soddisfacente.

Ho un viewcontroller con una proprietà denominata "contee", che è un NSMutableArray. Ho intenzione di drill-down uno schermo di navigazione ad una visione che sta selezionando il contee per una ricerca geografica. Così i trapani pagina di ricerca in basso alla pagina "selezionare contee".

Io passo NSMutableArray *counties al secondo controllore come spingere la seconda in pila navigazione. Io in realtà messo che la proprietà seconda del controllore "selectedCounties" (anche un NSMutableArray) con un puntatore a "contee" Il mio primo controller, come si vedrà di seguito.

Quando vado a addObject a questo, però, ottengo questo:

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

Ecco il mio codice:

in SearchViewController.h:

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

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

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

in SearchLocationsViewController.h:

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

}

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

nel SearchLocationsViewController.m (il punto qui è che siamo impostando ciascun elemento di una tabella essere attivi o meno nella lista delle contee selezionati):

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

Si muore a [self.selectedCounties addObject.... lì.

Ora, quando io stesso NSLog [self.selectedCounties class], mi dice che è un NSCFArray.

Come accade questo? Capisco su fasci di classe (o penso di fare in ogni caso), ma questo è esplicitamente un tipo specifico, e sta perdendo sottoclasse ad un certo punto in un modo che uccide tutta la faccenda. Ho appena completamente non capisco perché che sarebbe successo.

È stato utile?

Soluzione

La mia ipotesi è che non si sta assegnando l'array correttamente (ad esempio, NSMutableArray *arr = [[NSArray alloc] init], o stanno assegnando un NSArray alla variabile NSMutableArray. Puoi pubblicare il codice in cui si inizializza l'array?

Altri suggerimenti

Da dove init oggetto impostato come contee? Forse hai fatto un errore come:

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

In questo caso l'errore non compilazione pop-up, ma non si può prendere le modifiche su un array creato come quello!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top