2013-04-15 5 views
0

J'essaie d'implémenter une catégorie viewcontroller qui gère uialertview. Il doit implémenter -(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex et ne pas gâcher si viewcontroller doit également afficher une vue d'alerte. Pour ce faire, je mets le délégué de uialertview à un objet factice dans la catégorie au lieu de soi. Mais mon application se bloque avec exc_bad_access lorsque l'un des boutons dans alertview est cliqué. Quel est le problème avec le code ci-dessous?Implémentation de la méthode déléguée UIAlertView dans une catégorie

//Dummy handler .h 

@interface dummyAlertViewHandler : NSObject <UIAlertViewDelegate> 

@property (nonatomic, weak) id delegate; 

//.m 
-(id) initWithVC:(id) dlg 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     self.delegate = dlg; 
    } 
    return self; 
} 

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) 
    { 
     [self mainMenuSegue]; //There is no problem with the method 
    } 
} 

//Category .h 
#define ALERT_VIEW_DUMMY_DELEGATE_KEY "dummy" 
@property (nonatomic, strong) id dummyAlertViewDelegate; 

//Category .m 
@dynamic dummyAlertViewDelegate; 

- (void)setDummyAlertViewDelegate:(id)aObject 
{ 
    objc_setAssociatedObject(self, ALERT_VIEW_DUMMY_DELEGATE_KEY, aObject, OBJC_ASSOCIATION_ASSIGN); 
} 

- (id)dummyAlertViewDelegate 
{ 
    id del = objc_getAssociatedObject(self, ALERT_VIEW_DUMMY_DELEGATE_KEY); 

    if (del == nil) 
    { 
     del = [[dummyAlertViewHandler alloc] initWithVC:self]; 
     self.dummyAlertViewDelegate = del; 
    } 

    return del; 
} 

-(void) mainMenuSegueWithConfirmation 
{ 
    UIAlertView *ruSure = [[UIAlertView alloc] initWithTitle:@"Confirm leave" 
message:@"Are you sure you want to leave this game?" 
delegate:self.dummyAlertViewDelegate 
cancelButtonTitle:@"No" 
otherButtonTitles:@"Yes", nil]; 

    [ruSure show]; 
} 
+0

Quelle est la ligne sur laquelle le crash se produit? – matt

+0

il saute directement à l'assemblage je ne peux pas le suivre. J'ai activé le point d'arrêt pour toutes les exceptions, je suppose qu'il ne déclenche pas d'exception. – guenis

Répondre

1

Votre problème est cette ligne:

objc_setAssociatedObject(self, ALERT_VIEW_DUMMY_DELEGATE_KEY, aObject, OBJC_ASSOCIATION_ASSIGN); 

Plus précisément, la cause OBJC_ASSOCIATION_ASSIGN votre objet associé à ne pas être retenu. Pour que votre design fonctionne, vous devez le changer en OBJC_ASSOCIATION_RETAIN, comme ceci:

+0

merci beaucoup j'ai eu la partie d'association d'objet d'un blog mais n'ai pas pensé à jouer avec les params. – guenis

Questions connexes