IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Aide pour implémenter le callback, et le delegate


Sujet :

Objective-C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut Aide pour implémenter le callback, et le delegate
    Bonjour,

    Je suis actuellement chargé de rajouter des fonctionnalités dans une application Iphone depuis 1 semaine. Ce sont donc mes débuts dans l'objective C et Cocoa Touch.

    J'arrive à peu près à me débrouiller avec la documentation et quelques tutos trouvés sur le net.

    Mais la, je reste bloqué sur un tuto que j'ai lu pour envoyer des SMS depuis l'application.
    J'ai suivi cette page web :
    http://blog.mugunthkumar.com/coding/...nd-in-app-sms/

    J'ai bien pu faire les étapes 1 à 3, mais la 4iéme, je comprends pas trop ce qu'il faut faire, bien que j'ai lu de la doc sur la délégation,...

    Je vous mets l'intégralité de mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    //
    //  VueAcheterTicket.h
    //  Optymo
    //
    //  Created by Etienne Trimaille on 03/11/10.
    //  Copyright 2010 Optymo. All rights reserved.
    //
     
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <MessageUI/MessageUI.h>
     
    @interface VueAcheterTicket : UIViewController{
    	//Zone de texte
    	IBOutlet UITextView *texte;
    	IBOutlet UIButton *btnEnvoyer;
    	IBOutlet UILabel *titre;
    }
     
    - (IBAction) envoyerSMS: (id) sender;
     
    @end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    //
    //  VueAcheterTicket.m
    //  Optymo
    //
    //  Created by Etienne Trimaille on 03/11/10.
    //  Copyright 2010 Optymo. All rights reserved.
    //
     
    #import "VueAcheterTicket.h"
     
     
    @implementation VueAcheterTicket
     
    - (void)viewDidLoad{
    	titre.text = [[NSString alloc] initWithFormat:@"Acheter un ticket"];
    	texte.text = [[NSString alloc] initWithFormat:@"Tarif : 1,5€ + prix d'un SMS \n\nValidité : 1 heure \n\nEnvoyer BUS au 8 41 00"];
    }
     
    - (IBAction) envoyerSMS{
    	NSLog(@" tentative d'envoi d'un SMS");
    	MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];
    	if([MFMessageComposeViewController canSendText]){
    		NSLog(@"Envoi de SMS autorisé");
    			controller.body = @"BUS";
    			controller.recipients = [NSArray arrayWithObject:@"84100"];
    			controller.messageComposeDelegate =	self;
    			[self presentModalViewController:controller animated:YES];
    	}else {
    		NSLog(@"Envoi non autorisé");
    	}
     
     
    }
     
    - (void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    	switch (result) {
    		case MessageComposeResultCancelled:
    			[controller resignFirstResponder];
    			NSLog(@"Cancelled");
    			break;
     
    		case MessageComposeResultFailed:
    			NSLog(@"Error");
    			break;
     
    		case MessageComposeResultSent:
    			NSLog(@"OK");
    			break;
     
     
    		default:
    			break;
    	}
    }
     
     
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
     
    - (void)viewDidUnload {
        [super viewDidUnload];
    }
     
     
    - (void)dealloc {
        [super dealloc];
    }
     
     
    @end
    Par rapport au tuto, j'ai du enlever (id) sender à ma fonction envoyerSMS pour que la compilation fonctionne.

    Actuellement, quand j'appuie sur mon bouton, l'éditeur de SMS s'ouvre bien correctement avec les champs préremplis. Ensuite l'annulation du SMS fonctionne également en console, mais ne ferme pas l'éditeur de SMS.

    Merci d'avance pour vos conseils.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Gustry Voir le message
    Par rapport au tuto, j'ai du enlever (id) sender à ma fonction envoyerSMS pour que la compilation fonctionne.
    … ce qui n'est déjà pas normal: les fonctions qui sont des "actions" càd appelée lorsqu'un widget est manipulé dans l'UI ont toujours comme paramètre le "sender"…

    Citation Envoyé par Gustry Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			[controller resignFirstResponder];
    …c'est loin de suffire pour fermer une fenêtre :
    cela demande simplement au framework de changer d'objet courant : çàd de ne plus envoyer les évènements de l'UI à cet objet. Par exemple pour un champ texte, cela aura pour effet de ne plus afficher le curseur clignotant ni le highlight "sélectionné"…
    En aucun cas cela n'enlève l'objet de l'écran.

    Citation Envoyé par Gustry Voir le message
    Merci d'avance pour vos conseils.
    Lire les exemples et la documentation du site d'Apple ou de développeurs expérimentés, avant de lire du code sur des blogs de gens qui ont juste quelques jours d'expérience en iOS de plus que vous et pour lesquels vous n'êtes pas encore armé pour voir les maladresses ou - plus embêtant - les grosses bêtises.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    … ce qui n'est déjà pas normal: les fonctions qui sont des "actions" càd appelée lorsqu'un widget est manipulé dans l'UI ont toujours comme paramètre le "sender"…
    Ce n'est pas moi qui ai commencé ce projet. Et je confirme qu'il n'y a aucun (id)sender sur les boutons de toute l'application. Et si je le rajoute, j'obtiens une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2010-11-08 13:48:50.567 Optymo[1934:307] -[VueAcheterTicket pagePrecedente]: unrecognized selector sent to instance 0x1405b0
    2010-11-08 13:48:50.611 Optymo[1934:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[VueAcheterTicket pagePrecedente]: unrecognized selector sent to instance 0x1405b0'

    …c'est loin de suffire pour fermer une fenêtre :
    cela demande simplement au framework de changer d'objet courant : çàd de ne plus envoyer les évènements de l'UI à cet objet. Par exemple pour un champ texte, cela aura pour effet de ne plus afficher le curseur clignotant ni le highlight "sélectionné"…
    En aucun cas cela n'enlève l'objet de l'écran.
    Merci pour l'explication. Il me semble que cette ligne, c'est moi qui l'ai rajouté, suite à tutoriel que j'ai lu sur ipup.fr. Et je me disais que je pouvais toujours essayer de rajouter. Qui ne tente rien n'a rien ;-)

    Lire les exemples et la documentation du site d'Apple ou de développeurs expérimentés, avant de lire du code sur des blogs de gens qui ont juste quelques jours d'expérience en iOS de plus que vous et pour lesquels vous n'êtes pas encore armé pour voir les maladresses ou - plus embêtant - les grosses bêtises.
    Merci pour ces conseils. Je prends note bien sur. Je sais bien que j'ai seulement que quelques jours de pratique dans l'objective c. Et vu qu'apparemment le projet comporte des erreurs (comme le (id) sender), cela ne facilite pas les choses.

    Je viens de tomber sur cette page : http://developer.apple.com/library/i...inkElementID_6

    Je n'étais pas tombé dessus la dernière fois. Je vais faire un peu de lecture.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Gustry Voir le message
    Ce n'est pas moi qui ai commencé ce projet. Et je confirme qu'il n'y a aucun (id)sender sur les boutons de toute l'application. Et si je le rajoute, j'obtiens une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2010-11-08 13:48:50.567 Optymo[1934:307] -[VueAcheterTicket pagePrecedente]: unrecognized selector sent to instance 0x1405b0
    2010-11-08 13:48:50.611 Optymo[1934:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[VueAcheterTicket pagePrecedente]: unrecognized selector sent to instance 0x1405b0'
    apparemment c'est un autre problème que vous avez :

    le "(id)sender" qui manque dans la déclaration c'est pas trop grave puisque cela revient à dire que vous ignorez le paramètre : çà c'est pour l'aspect "programmation"…
    toutefois il DOIT être là (dans le .h et le .m) pour que la méthode soit reconnue par InterfaceBuilder comme étant une action possible : sans ce paramètre IB ne vous présentera jamais la fonction dans la liste des choix possibles pour la lier à un objet.

    par contre le problème que vous rencontrez est sans doute que quelqu'un s'est amusé à ajouter un appel direct à "pagePrecedente" dans le code, et comme il ne savait pas quoi mettre comme paramètre il a préféré l'enlever sans se poser plus de question…
    trouvez ces appels directs dans le code et remplacez les par "[… pagePrecedente:nil]" et çà marchera très bien…
    (il est à supposer aussi que la même chose existe pour un hypothétiques "pageSuivante"… voire encore d'autres cas similaires…)

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/03/2011, 18h18
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo