NSMutableArray non può essere aggiunto a
-
27-09-2019 - |
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.
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!