[iOS] Problème delegate

BenArko

Membre confirmé
15 Mai 2010
18
0
Bonjour,

j'ai défini le protocole suivant dans la classe CreationTacheViewController :

Bloc de code:
@interface CreationTacheViewController : UIViewController <UITextViewDelegate>

@property (nonatomic, assign) id <CreateTacheDelegate> delegate;
...
@end

@protocol CreateTacheDelegate <NSObject>
- (void)createTacheController:(CreationTacheViewController *)controller didCreateTache:(Tache *)tache;
@end

et j'utilise  ce protocole dans la classe TacheViewController où je définis la méthode comme suis :

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"creationTache"])
    {
        _creationTacheViewController = [[CreationTacheViewController alloc] init];
        _creationTacheViewController.delegate = self;
    }
}

- (void)createTacheController:(CreationTacheViewController *)controller didCreateTache:(Tache *)tache
{
    tache.projet = _projet;
    [_projet.managedObjectContext save:nil];
    [_tacheArray addObject:tache];
    [self.tableView reloadData];
}
Le problème c'est qu'une fois dans l'exécution du code de la classe CreationTacheViewController l'objet delegate est a nil ce qui fait que la méthode createTacheController didCreateTache n'est pas appelé, je voudrais donc savoir comment faire pour que l'objet delegate ne soit pas null.

merci d'avance
 
Est-ce que tu es sûr que ton code passe sur la ligne "_creationTacheViewController.delegate = self;" avant de vouloir utiliser ton delegate ?
 
Non les adresses des deux objets ne sont pas les mêmes. Je pense que l'objet _creationViewController est supprimé une fois que la méthode PrepareForSeque est exécutée. Sinon j'ai essayé ceci :

Bloc de code:
//TacheViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"creationTache"])
    {
        _creationTacheViewController = [[CreationTacheViewController alloc] initWithDelegate:self];
    }
}

//CreationTacheViewController.m
- (id)initWithDelegate:(id)p_delegate
{
    self = [super init];
    if( self )
    {
        self.delegate = p_delegate;
    }
    return self;
}
Si besoin de plus de code ne pas hésiter à demander et je peux même fournir le projet entier si ça peut aider.
 
Regarde la façon dont ton objet controller est créé. Ne l'aurais-tu pas créé à la fois dans interface builder et dans ton code ? Et donc tu n'utiliserais pas la bonne instance.
 
Comment peut on voir la façon dont l'objet du controller est créé ? Et comment peut on créer une instance dans interface builder ?
 
Et comment peut on créer une instance dans interface builder ?
Dans le vue "Objects" tu peux ajouter des instances des classes que tu trouves dans "Objects & Controller". Il suffit ensuite de les référencer comme "Outlet" dans un objet que ce dernier puisse l'utiliser.
 
au vu de tes explications je peux te dire que je n'ai pas créé d'instance par le biais d'interface builder et donc normalement il devrait y en avoir qu'une seule. Sinon je c'est pas si ça peut aider mais dans la partie qui me pose problème pour arriver sur le view controller CreateTacheViewController j'utilise une transition en mode "modal" qui "arrive sur un navigation controller qui est lui même relier par une liaison de type relationship à mon view controller CreateTacheViewController.
 
Ba non c'est ça le probléme c'est que les deux variables ne sont pas les mêmes, le premier que je créé dans la méthode prepareForSegue est supprimé une fois que la méthode est terminée. Puis une nouvelle est crée mais son delegate n'est pas initialisé ce qui fait que je ne peux pas utiliser le delegate que j'ai créé dans la classe CreationTacheViewController.
 
Si tu mets un point d'arrêt dans le constructeur de ton contrôleur, est-ce que ton programme y passe une fois ou deux fois ?
 
Une fois.

Pour Rappel voici mon constructeur et son appel

appel du constructeur dans la classe TacheViewController :

Bloc de code:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"creationTache"])
    {
        self.creationTacheViewController = [[CreationTacheViewController alloc] initWithDelegate:self];
    }
}
constructeur de la classe CreationTacheViewController :

Bloc de code:
- (id)initWithDelegate:(id)p_delegate
{
    self = [super init];
    if( self )
    {
        self.delegate = p_delegate;
    }
    return self;
}