2010-10-16 7 views
1

Je reçois un type d'erreur lors de la définition d'une valeur sur une propriété NSArray de mon code. Je vais vous envoyer du code et la sortie du débogueur.Objectif C: erreur de propriétés


@interface RootViewController : UITableViewController { 
@private 
NSArray* regioesArray; 
// NSString *str; 
// NSArray *ar; 
} 

@property(nonatomic, retain) NSArray *regioesArray; 

@implementation RootViewController 

@synthesize regioesArray; 
//@synthesize str; 
//@synthesize ar; 

- (void)viewDidLoad { 
[super viewDidLoad]; 

//Set Title 
self.title = @"Regiões"; 
self.regioesArray = nil; 
} 

- (void)viewDidUnload { 
    self.regioesArray = nil; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return 2; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
if(section == 0 && self.regioesArray != nil){ 
    return [regioesArray count]; 
}else { 
    return 0; 
} 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *MyIdentifier = @"MyIdentifier"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; 
} 

// Set up the cell 
Zona *zona = (Zona *)[regioesArray objectAtIndex:indexPath.row]; 
cell.text = [zona nome]; 
[cell.contentView addSubview: [self getDetailDiscolosureIndicatorForIndexPath: indexPath]]; 
[zona release]; 

return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Navigation logic 
} 


/* 
Override if you support editing the list 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    // Delete the row from the data source 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; 
} 
if (editingStyle == UITableViewCellEditingStyleInsert) { 
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
} 
} 
*/ 


/* 
Override if you support conditional editing of the list 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
// Return NO if you do not want the specified item to be editable. 
return YES; 
} 
*/ 


/* 
Override if you support rearranging the list 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
} 
*/ 


/* 
Override if you support conditional rearranging of the list 
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
// Return NO if you do not want the item to be re-orderable. 
return YES; 
} 
*/ 


- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
} 

- (void)viewDidDisappear:(BOOL)animated { 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 


- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview 
// Release anything that's not essential, such as cached data 
} 


- (void)dealloc { 
[super dealloc]; 
[regioesArray release]; 
} 


- (UIButton *) getDetailDiscolosureIndicatorForIndexPath: (NSIndexPath *) indexPath 
{ 
    UIButton *button = [UIButton buttonWithType: UIButtonTypeDetailDisclosure]; 
    button.frame = CGRectMake(320.0 - 44.0, 0.0, 44.0, 44.0); 
    [button addTarget:self action:@selector(detailDiscolosureIndicatorSelected:) forControlEvents:UIControlEventTouchUpInside]; 
    return button; 
} 

- (void) detailDiscolosureIndicatorSelected: (UIButton *) sender 
{ 
    // 
    // Obtain a reference to the selected cell 
    // 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: [self.tableView indexPathForSelectedRow]]; 

    // 
    // Do something like render a detailed view 
    // 
    /// ... 
} 

@end 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

// Create the navigation and view controllers 
RootViewController *rootViewController = [[[RootViewController alloc] initWithStyle:UITableViewStylePlain] autorelease]; 

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 
self.navigationController = aNavigationController; 

NSArray * regioes = [self createRegions]; 
    rootViewController.regioesArray = regioes; 


[regioes release]; 
[rootViewController release]; 
[aNavigationController release]; 
// Configure and show the window 
[window addSubview:[navigationController view]]; 
[window makeKeyAndVisible]; 

} 

L'erreur est sur la ligne rootViewController.regioesArray = Regiões; Je ne peux pas attribuer de valeur à cette propriété, même pas "néant".

Voici le debug:

 2010-10-16 01:35:43.965 TransitoRio[4224:207] *** -[RootViewController setRegioesArray:]: unrecognized selector sent to instance 0x1813ef0 2010-10-16 01:35:43.968 TransitoRio[4224:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[RootViewController setRegioesArray:]: unrecognized selector sent to instance 0x1813ef0' 

Est-ce que quelqu'un sait ici ce qui pourrait arriver?

Comme demandé, voici la méthode « createRegions »:

- (NSArray *)createRegions { NSMutableArray *regioes = [[NSMutableArray alloc] init]; Zona *regiao = [[Zona alloc] init]; regiao.nome = @"Zona Sul"; [regioes addObject:regiao]; [regiao release]; regiao = [[Zona alloc] init]; regiao.nome = @"Zona Norte"; [regioes addObject:regiao]; [regiao release]; regiao = [[Zona alloc] init]; regiao.nome = @"Zona Oeste"; [regioes addObject:regiao]; [regiao release]; regiao = [[Zona alloc] init]; regiao.nome = @"Centro"; [regioes addObject:regiao]; [regiao release]; // Sort the regions. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"nome" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; NSArray *sortedRegions = [regioes sortedArrayUsingDescriptors:sortDescriptors]; [sortDescriptor release]; [sortDescriptors release]; [regioes release]; [sortedRegions retain]; return sortedRegions; }
+0

Avez-vous essayé un "tout nettoyer" et recompilé? Parfois, les éléments de construction de xcode sont corrompus et ne parviennent pas à reconstruire un fichier. Il pourrait utiliser l'ancien code objet. Quoi qu'il en soit, juste quelque chose à essayer avant de faire quoi que ce soit d'autre. – Nimrod

+0

Oui, je l'ai essayé ... mais pas d'accord ... –

+0

pouvez-vous poster votre méthode createResions? –

Répondre

1

Je vois que vous avez déclaré votre choix d'être privé dans le fichier d'en-tête, donc vous ne devriez pas accéder à la propriété à l'extérieur de la classe.

+0

Certes, la variable d'instance est privée, mais les méthodes setter et getter doivent toujours être publiques je pense (c'est-à-dire les méthodes synthétisées dans l'implémentation). Je peux me tromper, mais je ne pense pas que ce soit un problème. –

+0

Ouais, je pense aussi que ça n'a rien à voir avec le @private ... –

+0

Bon, j'ai essayé ça avec un exemple et les méthodes setter/getter ont été créées. Je ne vois pas le problème, mais une chose importante à noter: vous ne devriez pas conserver la variable sortedRegions dans la méthode createRegions car elle est déjà autoeleased – brutella