Problème avec un Wait Screen View

DonSilyaDonSilya Membre
18:39 modifié dans Vos applications #1
Bonjour,

Je développe actuellement une appli iPhone (SDK 3.1.3) et j'ai un petit problème lors de l'affichage d'un View (plus exactement un View "Recherche en cours")

Je m'explique : lorsque j'affiche une TableView avec des cellules, l'utilisateur à  la possibilité de cliquer sur une cellule pour afficher les détails. Entre-temps, j'affiche un View pour indiquer que le chargement est en cours.

Or, s'il y a plusieurs cellules dans le résultat, et que l'utilisateur scroll la TableView pour cliquer sur une cellule en bas, le View "Recherche en cours" ne s'affiche plus correctement. (soit il s'affiche à  moitié ou ne s'affiche pas car il reste en haut de la page).

Donc j'aimerais savoir si c'est possible d'identifier la position de la Table View pour bien positionner le Wait Screen View, ou bien de remonter automatiquement la Table View en haut quand je clique sur une cellule.

J'espère que j'étais assez clair dans mes explications  :)

Merci d'avance pour vos réponses et bonne journée,
«1

Réponses

  • iSofTomiSofTom Membre
    18:39 modifié #2
    Bonjour DonSilya,
    J'ai pas très bien compris, tu veux afficher le "chargement en cours" juste au dessus de la cellule cliquée ? Ou l'afficher pour que ça couvre tout l'écran?

    Peux-tu nous mettre un bout de code pour voir comment tu l'affiches pour l'instant ?
  • DonSilyaDonSilya Membre
    mai 2010 modifié #3
    Bonjour,

    Merci pour votre réponse,

    Oui effectivement je veux afficher le wait screen au dessus de la cellule pour qu'il couvre tout l'écran.

    Voici mon code :


    - (void) LaunchDownloadData: (NSString *)idPersonne {	<br />	<br />	WaitScreenController* aWaitScreen = [[WaitScreenController alloc] initWithNibName:@&quot;WaitScreenController&quot; bundle:nil];<br />	waitView = aWaitScreen.view;<br />	[parentDelegate.view addSubview:waitView];<br />	<br />	<br />	NSURLRequest* theRequest;<br />	<br />	switch (CollPres) {<br />		case 0:<br />			theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:[@&quot;&quot; stringByAppendingString:idPersonne]]];	<br />			ResultatRechercheDetail.getDetailCollPres = 0;<br />			break;<br />		case 1:<br />			theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:[@&quot;&quot; stringByAppendingString:idPersonne]]];<br />			ResultatRechercheDetail.getDetailCollPres = 1;<br />			break;<br />		default:<br />			break;<br />	}<br />
    


    Une capture d'écran du simulateur : http://twitpic.com/1spf2d
  • muqaddarmuqaddar Administrateur
    18:39 modifié #4
    Bonjour,

    N'hésite pas à  mettre ton code entre les balises CODE pour qu'il soit plus lisible par les membres. Merci.
  • DonSilyaDonSilya Membre
    18:39 modifié #5
    @muqaddar : voilà  c'est fait ^^
  • iSofTomiSofTom Membre
    18:39 modifié #6
    Ce que je voulais savoir c'était surtout comment était ton controller: est-ce que c'est un UITableViewController ou est-ce que c'est un UIViewController classique avec un UITableView que tu ajoutes sur sa vue (addSubview) ?

    J'ai pas testé mais je pense que ça devrait marcher avec un UIViewController classique. Tu fais un addSubview de ta UITableView sur la view de ce viewController. Et du coup si tu fais un addSubview de ta vue waitScreen sur la view du viewController ça devrait avoir l'effet que tu veux...

    Une autre solution sinon c'est de changer la page, afficher la page de détails vide avec un petit UIActivityIndicatorView le temps que ça charge puis le supprimer pour bien afficher les détails
  • DonSilyaDonSilya Membre
    18:39 modifié #7
    En effet, j'ai un UIViewController avec un UITableView que j'ajoute à  l'aide d'un addSubview (cf. code dans le post précedent).

    Par ailleurs, pourriez-vous me donnez plus de détails sur votre deuxième solution qui me paraà®t trés intéressante (ça ne fait que deux mois que je développe des app iPhone ^^)

    Merci d'avance,
  • iSofTomiSofTom Membre
    18:39 modifié #8
    je ne sais pas à  quoi correspond ton "parentDelegate", mais si ta méthode "LaunchDownloadData:" est bien dans ton UIViewController (ce que je suppose). Essaye de remplacer
    [parentDelegate.view addSubView:waitView];
    

    par:
    [self.view addSubview:waitView];
    


    Pour la deuxième solution, tu crées un UIViewController qui ne contient qu'un UIActivityIndicatorView, et dans la méthode "viewDidAppear" du UIViewController tu lances la requête pour afficher les détails. Et dès que t'auras le résultat, t'auras plus qu'à  faire un addSubview par dessus ton activityIndicator...

    Bonne chance.
  • MetablueMetablue Membre
    18:39 modifié #9
    Il me semble bien que je suis exactement dans le même problème que toi à  ceux ci près que moi mon rechargement de donnée n'entraine pas de changement de vue mais un rechargement.

    Par contre pour rentrer dans les détails de mon soucis la subView ne s'affiche pas a tous les coups.

    Le rechargement de donnée se passe bien et ça n'entraine pas de conséquences si la subView s'affiche pas a part que l'utilisateur peut continuer de cliquer et risque fortement de relancer un rechargement de donnée alors qu'il est déjà  entrain de se passer. Là  je sais que mon appli risque de planter.


    Tu peux aussi jouer avec le
    self.view.userInteractionEnabled = NO;
    


    Le temps que les donnée se charge
  • DonSilyaDonSilya Membre
    18:39 modifié #10
    @Moonlight Shadow : quand je remplace mon .view par .self mon app crash :s

    @Metablue : ça me résout la moitié de mon problème, j'arrive mnt à  bloquer ma Table quand je clique  ^^ il me reste seulement à  bien positionner mon wait screen :)
  • iSofTomiSofTom Membre
    18:39 modifié #11
    t'as remplacé le .view par .self ?
    non je te disais de remplacer parentDelegate.view par self.view !
    relis mon post précédent...  :)
  • DonSilyaDonSilya Membre
    18:39 modifié #12
    Ah oui c'est vrai désolé ^^

    Mnt il me donne une erreur : request for member 'view' in something not a structure or union

  • iSofTomiSofTom Membre
    18:39 modifié #13
    ça c'est bizarre...
    Tu peux nous donner le code de ton .h (au moins ce qu'il y a avant les fonctions) stp ?
  • DonSilyaDonSilya Membre
    18:39 modifié #14
    Ok :)

    Au fait j'ai 3 classes :

    ResultatSimpleController : c'est la table View dans la quelle j'ai mes resultats sous formes de cellules.

    RechercheDetailQuery : dans la quelle j'effectue ma recherche avec les détails.

    WaitScreenView : la page de recherche.

    RechercheDetailQuery.h
    <br />#import &lt;Foundation/Foundation.h&gt;<br />#import &quot;PersonneDetail.h&quot;<br /><br /><br /> @interface RechercheDetailQuery : NSObject {<br /><br />	PersonneDetail* ResultatRechercheDetail;<br />	<br />	NSMutableData* receivedData;<br />	bool DataLoaded;<br />	UIAlertView* usageAlertView;<br />	UIView* waitView;<br />	UIViewController* parentDelegate;<br />	NSInteger CollPres;<br />}<br /><br />- (id)initWithDelegate: (UIViewController*) delegate;<br />- (NSData*) ClearData: (NSData*) DataToClear;<br />- (void)handleError: (NSError*) err;<br />- (void)LaunchDownloadData: (NSString*) idPersonne;<br /><br />@property (nonatomic,retain) PersonneDetail* ResultatRechercheDetail;<br />@property (nonatomic) bool DataLoaded;<br />@property (nonatomic, retain) UIAlertView *usageAlertView;<br />@property (nonatomic) NSInteger CollPres;<br /><br />@end<br />
    


    WaitScreenView.h
    #import &lt;UIKit/UIKit.h&gt;<br />#import &lt;Foundation/Foundation.h&gt;<br /><br />@interface WaitScreenView: UIViewController {<br /><br />}<br /><br />@end
    


  • iSofTomiSofTom Membre
    18:39 modifié #15
    Ah ok... forcément self.view ne pouvait pas marcher puisque tu n'était pas dans un UIViewController à  l'endroit où tu l'appelais.

    Bon je récapitule: si j'ai bien compris, dans ton appli tu as une liste (UITableView) et quand tu cliques sur un élément tu veux afficher une petite vue d'attente puis une vue contenant des détails sur l'élément sélectionné, c'est ça?

    Si c'est bien ça, il te faudrait au moins 2 UIViewController (ou UITableViewController): 1 pour la liste de tes éléments et 1 pour la vue des détails.

    Je ne sais pas ce qu'est ResultatSimpleController (puisque tu n'as pas mis le code), mais je suppose, au vu du nom, que c'est bien un UIViewController, par contre pourquoi RechercheDetailQuery n'en est pas un ?

    Et du coup ta vue WaitScreenView (qui d'ailleurs porte mal son nom puisque c'est un viewController, mais ça c'est une autre histoire), tu voudrais l'afficher par dessus ta liste (ResultatSimpleController) ou par dessus te détails (RechercheDetailQuery) ?
  • DonSilyaDonSilya Membre
    18:39 modifié #16
    Oui globalement vous avez compris mon appli :)

    Le ResultatSimpleController c'est un UITableViewController avec des cellules, quand je clique sur une des cellules j'appelle RechercheDetailQuery qui elle fait la recherche de ces détails (analyse des fichers XML) aprés c'est une autre classe qui affiche ces détails.

    Mon problème est dans la transition entre Resultat et RechercheDétail (qui n'a pas de fichier .xib) : je voudrais afficher le WaitScreen quand j'appelle cette dernière. Le WaitScreen je l'appelle dans Recherche Détail mais normalement s'affiche au dessus de la TableView :)
  • DonSilyaDonSilya Membre
    18:39 modifié #17
    Et voici le .h de mon ResultatSimpleController :
    #import &lt;UIKit/UIKit.h&gt;<br />#import &quot;RechercheUnifieQuery.h&quot;<br />#import &quot;RechercheDetailQuery.h&quot;<br />#import &quot;ResultatRechercheUnifie.h&quot;<br />#import &quot;DetailPersonneController.h&quot;<br /><br />@interface ResultatSimpleController : UITableViewController {<br />	<br />	ResultatRechercheUnifie* resultatRechercheUnifie;<br />	RechercheDetailQuery* maRechercheDetail;<br /><br />}<br /><br />@property(nonatomic, retain) ResultatRechercheUnifie* resultatRechercheUnifie;<br /><br />@end
    

  • iSofTomiSofTom Membre
    18:39 modifié #18
    Ok je pense avoir compris d'où venais ton problème...
    Pour le résoudre je te propose cette solution:

    Il faudrait que ton ResultatSimpleController ne soit plus un UITableViewController mais un UIViewController qui respecte les protocols UITableViewDataSource et UITableViewDelegate.  il faudrait également que ce controller ait un attribut UITableView qui soit ajouté à  la vue de ce controller par addSubview. Ainsi la view de ton ResultatSimpleController ne sera pas une UIScrollView mais une UIView classique qui contient une UIScrollView, et donc quand tu ajouteras ton WaitScreenView.view quand tu le faisais avant, elle s'ajoutera par dessus la scrollView et non pas dans la scrollView!

    Si t'as pas compris ce que j'ai dit (car c'est ptet clair que dans ma tête  :P) hésite pas à  me redemander.

    Au fait, je préfererais que tu me tutoies si ça ne te dérange pas  ;)
  • DonSilyaDonSilya Membre
    18:39 modifié #19
    Ok merci beaucoup pour ta réponse, je vais essayer cette solution :)

    Par contre, j'ai 1 petite question : comment je fais pour que mon ViewController respecte les protocols ?
  • iSofTomiSofTom Membre
    18:39 modifié #20
    comme ça:
    <br />@interface ResultatSimpleController : UIViewController &lt;UITableViewDataSource, UITableViewDelegate&gt; {<br />}<br />
    


    après il faut que tu implémentes les méthodes "required" de ces deux protocols (regarde dans la doc). Mais normalement si tu avais un UITableViewController, c'est déjà  fait!
  • MetablueMetablue Membre
    18:39 modifié #21
    Oublie pas de les linker (le datasource et le delegate) de ta TableView dans IB avec le FileOwner

    PS :  ;D J'ai fais exactement ça dans mon appli sauf que moi c'est du bol  :D
  • DonSilyaDonSilya Membre
    18:39 modifié #22
    Merci pour vos réponses :)

    Sinon, quelqu'un aura des infos sur la propriété frame d'un UIView, elle sert à  quoi et comment l'utiliser ?

  • iSofTomiSofTom Membre
    18:39 modifié #23
    C'est pour définir sa position (frame.origin) et sa taille (frame.size)
  • DonSilyaDonSilya Membre
    18:39 modifié #24
    Merci beaucoup pour vos réponses, grâce à  vous j'ai réussi à  résoudre le problème :)

    Bonne journée,
  • DonSilyaDonSilya Membre
    18:39 modifié #25
    Allez dernière question promis ^^

    Comment devrais-je faire pour  qu'il me positionne un Cell au milieu de l'écran automatiquement grâce à  cette méthode -CGRectMake(x, y, width, height)  autrement dit, il faut attribuer quoi comme valeurs à  x et y ?

    Pour les 2 autres attributs, je sais les valeurs par quoi je dois remplir :)

  • savepandasavepanda Membre
    18:39 modifié #26
    dans 1275380414:

    Allez dernière question promis ^^

    Comment devrais-je faire pour  qu'il me positionne un Cell au milieu de l'écran automatiquement grâce à  cette méthode -CGRectMake(x, y, width, height)  autrement dit, il faut attribuer quoi comme valeurs à  x et y ?

    Pour les 2 autres attributs, je sais les valeurs par quoi je dois remplir :)


    Si c'est pour le positionner au milieu de la vue de ton viewController tu peux te baser sur la taille de la vue pour calculer ton x et ton y :
    CGFloat x = [[self view] frame].size.width/2;<br />CGFloat y = [[self view] frame].size.height/2;
    
  • DonSilyaDonSilya Membre
    18:39 modifié #27
    Ok merci @savepanda :)

    et si j'ai besoin de me baser sur la position de la vue, comment faire ?
  • CéroceCéroce Membre, Modérateur
    18:39 modifié #28
    Creuse-toi un peu la tête, ce n'est pas une question de programmation, mais de géométrie, qui se règle en une minute avec un papier et un crayon.
  • DonSilyaDonSilya Membre
    18:39 modifié #29
    j'ai passé beaucoup de temps à  chercher sans rien trouver, c'est pourquoi  je demande ...
  • CéroceCéroce Membre, Modérateur
    juin 2010 modifié #30
    Et avec ça, toujours pas ?

    Tu connais la taille du grand rectangle.
    Tu connais son origine.
    Tu connais la taille du petit rectangle.
  • DonSilyaDonSilya Membre
    18:39 modifié #31
    Peut être que je n'étais pas assez clair dans mon post.

    Je cherche à  déterminer la position d'un UITableView (qui du coup n'est pas fixe car on peut scroller et donc sa position change).

    avec ce code on j'arrive à  avoir la taille :
    <br />&nbsp; &nbsp; &nbsp; &nbsp; CGFloat x = [[self view] frame].size.width/2;<br />	CGFloat y = [[self view] frame].size.height/2;<br />	[waitView setFrame:CGRectMake(x,y,300,300)];<br />	[self.view addSubview:maView];<br />
    


    En gros, comment faire pour remplacer le size par la position .

    Merci

Connectez-vous ou Inscrivez-vous pour répondre.