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.
Comment pouvez-vous créer votre counti es objet? – Vladimir
Où avez-vous assigné 'counties'? – kennytm