Méthodes de AppDelegate ne sont pas appelées
Bonjour tout le monde,
Je développe actuellement une application avec une partie chat. J'utilise le xmppFramework. le problème c'est que les méthodes définies dans mon appDelegate ne sont à aucun moment appelées
Voici le code de mon AppDelegate
- (void)setupStream {
xmppStream = [[XMPPStream alloc] init];
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
//[self connect];
}
- (void)goOnline {
XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];
}
- (void)goOffline {
XMPPPresence *presence = [XMPPPresence presenceWithType:@unavailable];
[[self xmppStream] sendElement:presence];
}
- (BOOL)connect {
[self setupStream];
NSString *emailUserDefault = [[NSUserDefaults standardUserDefaults] stringForKey:@email];
NSString *jabberID = [emailUserDefault stringByAppendingString:@"@server.local"];
NSLog(@%@",jabberID);
NSString *myPassword = [[NSUserDefaults standardUserDefaults] stringForKey:@password];
NSLog(@%@",myPassword);
if (![xmppStream isDisconnected]) {
NSLog(@You are connected);
return YES;
}
if (jabberID == nil || myPassword == nil) {
return NO;
}
[xmppStream setMyJID:[XMPPJID jidWithString:jabberID]];
//xmppStream.myJID = [XMPPJID jidWithString:jabberID];
password = myPassword;
NSError *error = nil;
if (![xmppStream connectWithTimeout:20 error:&error])
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@Error
message:[NSString stringWithFormat:@Can't connect to server %@", [error localizedDescription]]
delegate:nil
cancelButtonTitle:@Ok
otherButtonTitles:nil];
[alertView show];
return NO;
}
return YES;
}
- (void)disconnect {
[self goOffline];
[xmppStream disconnect];
}
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
isOpen = YES;
NSError *error = nil;
[[self xmppStream] authenticateWithPassword:password error:&error];
}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
[self goOnline];
}
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
NSString *presenceType = [presence type]; // online/offline
NSString *myUsername = [[sender myJID] user];
NSString *presenceFromUser = [[presence from] user];
if (![presenceFromUser isEqualToString:myUsername]) {
if ([presenceType isEqualToString:@available]) {
[__chatDelegate newBuddyOnline:[NSString stringWithFormat:@%@", presenceFromUser, @server.local]];
} else if ([presenceType isEqualToString:@unavailable]) {
[__chatDelegate buddyWentOffline:[NSString stringWithFormat:@%@", presenceFromUser, @server.local]];
}
}
}
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {
NSString *msg = [[message elementForName:@body] stringValue];
NSString *from = [[message attributeForName:@from] stringValue];
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:msg forKey:@msg];
[m setObject:from forKey:@sender];
[__messageDelegate newMessageReceived:m];
}
Voici le code de ma classe chatViewController:
- (myApplicationAppDelegate *)appDelegate {
return (myApplicationAppDelegate *)[[UIApplication sharedApplication] delegate];
}
- (XMPPStream *)xmppStream {
return [[self appDelegate] xmppStream];
}
- (void)viewDidLoad
{
[super viewDidLoad];
onlineBuddies = [[NSMutableArray alloc ] init];
myApplicationAppDelegate *del = [self appDelegate];
[self xmppStream];
NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@email];
del._chatDelegate = self;
if (login) {
if ([[self appDelegate] connect]) {
NSLog(@show buddy list);
}
} else {
NSLog(@Login Error);
}
}
Si vous voyez comment faire régler ce problème, n'hesitez pas à me faire part de vos points de vue.
Best regards
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je t'invite à éditer ton message pour :
Par rapport aux méthodes implémentées dans AppDelegate, c'est pour vous donner une idée de ce qu'il y a dans cette classe. De mon coté, lorsque je lance l'application et plus précisément je passe par la classe chatViewController, les méthodes de xmppframework implémentées dans la classe AppDelegate ne sont pas appelées carrément (à part la méthode connect qui est appelée en dur dans la méthode application:didFinishLaunchingWithOptions: ). Ce que je n'arrive pas à comprendre c'est Pourquoi ces méthodes là ne sont pas appelées à aucun moment de la vie de l'application.
Voilà
Et donc, tu n'as pas répondu à ma question, qu'as-tu essayé, que donnent tes tests avec les breakpoints, les valeurs des variables... et surtout, pourquoi tu voudrais que ces méthodes soient magiquement appelées ? Tu as bien indiqué qqpart qui était le delegate de ton XMPPStream par exemple, etc ?
Je reste sur l'impression que tu confonds AppDelegate et delegate de manière générale et ne comprend pas comment le pattern delegate fonctionne (pourtant un pattern de base pour faire du Cocoa)
Ah oui effectivement tu sembles confondre.
J'ai trouvé un site qui explique comment fonctionne un delegate en objective c
http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/
Merci pour vos réponses,
J'attendais des résultats déterminés en essayant de lancer mon application. En fait non rien ne ce passe. En mettant des breakpoints sur les méthodes écrites dans la classe AppDelegate, le compilateur ne s'arrête même pas (à part la méthode connect qui renvoie YES car elle est appelé directement dans le code )
Bah, je m'attendais à que les méthodes soient appelées car dans une autre classe de mon application, j'ai écrit:
Merci, vraiment ça éclaire bien les idées avec des exemples super sympa.