2011-02-17 3 views
0

J'essaie de générer une UIActionSheet à partir d'un NSDictionary. CodeCountryMap est une variable NSDictionary définie dans le fichier .h. Le code compilé correctement mais se bloque lors de l'exécution. Mais tout le code fonctionne lorsque l'initialisation se fait dans la méthode HANDLEEVENTSErreur avec NSDictionary

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSArray *codes = [NSArray arrayWithObjects:@"91", @"01", @"002", nil]; 
    NSArray *cName = [NSArray arrayWithObjects:@"ABC", @"QWE", @"XYZ", nil]; 
    codeCountryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName]; 
} 

-(IBAction) handleEvents:(id)sender 
{  
    UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil 
              destructiveButtonTitle:nil otherButtonTitles:nil,nil]; 

    for(id key in codeCountryMap) { 
     [displayCodeCountryMap addButtonWithTitle:(NSString *)key]; 
    } 

    [displayCodeCountryMap addButtonWithTitle:@"Cancel"]; 
    displayCodeCountryMap.cancelButtonIndex = [codeCountryMap count]; 
    displayCodeCountryMap.actionSheetStyle = UIActionSheetStyleBlackOpaque; 
    [displayCodeCountryMap showInView:self.view]; 
    [displayCodeCountryMap release]; 
    [country resignFirstResponder]; 
} 

Les application se bloque lorsque les HANDLEEVENTS: méthode est appelée. Toute sorte d'aide serait grandement appréciée.

Merci d'avance.

+0

Quelle est l'erreur que vous obtenez? quelle ligne est-ce que ça se passe? –

+0

il s'agit d'une erreur d'exécution .......... se produit lorsque la méthode handleEvents est appelée. J'ai aussi mis à jour la question – devsri

Répondre

2

Il s'agit probablement d'un problème de gestion de la mémoire. Il semble que vous définissez l'iCode codeCountryMap sur un objet autoreleased de NSDictionary et ne pas le conserver (du moins pas dans cet extrait de code). Cela signifie que lorsque la méthode 'handleEvents' est appelée, l'élément NSDictionary a été libéré de la mémoire. Essayez de conserver l'élément NSDictionary ou, si codeCountryMap est défini comme une propriété conservée, utilisez le code suivant pour le définir.

self.codeContryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName]; 

Ceci utilisera les méthodes synthétisées pour définir la propriété et la conserver.

+0

J'ai déjà utilisé @property (nonatomic, retain) NSDictionary codeCountryMap; pour définir la propriété reatin dans mon fichier .h et synthétisé le même dans le fichier .m. – devsri

+1

Avez-vous changé votre code pour utiliser self.codeCountryMap au lieu de simplement codeCountryMap? Lorsque vous n'utilisez pas 'self. [Var]', il n'utilise pas les méthodes de propriété pour définir la variable (vous définissez l'iVar directement) et par conséquent, il n'est pas conservé. – DerekH

+0

merci une tonne got that ...... cela a fonctionné ..:) .... Je vais garder cela à l'esprit pour l'avenir ... encore une fois – devsri

0

Pas besoin de 2 terminaisons nil dans l'argument otherButtonTitles. Si vous aviez passé dans des chaînes, il devrait être nul. Puisque vous n'avez pas, un nil est suffisant.

UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil 
              destructiveButtonTitle:nil otherButtonTitles:nil];