GeckoGeek.fr

Paradigme d'un lézard

Samedi 21 Octobre 2017

Gérer des UIView avec un UIViewController sur iPhone

Par Vinz le 24/11/2009 dans Apple, Programmation | 23 commentaires

Nous avons récemment vu comment gérer les bases d’une UIView. Voyons maintenant comment contrôler les UIView depuis un UIViewController. Comme son nom l’indique, ce dernier permet de contrôler les vues de votre application afin de respecter un minimum le modèle MVC.

SDK-iPhone

I] Rapides Rappels sur le modèle MVC

En programmation vous avez différentes manières d’aborder un problème. En général une méthode barbare où vous n’architecturez pas vos données se terminera souvent mal lorsque vous souhaiterez améliorer votre application. C’est pourquoi des gens ont réfléchi à différents “modèles” adaptés à différentes situations. Le modèle MVC (Modèle, Vue, Contrôleur) permet de séparer le code s’occupant d’afficher (les vues) et de gérer les données (les modèles). Les contrôleurs sont là pour faire la liaison entre les deux. Ainsi vous pouvez utiliser des vues avec plusieurs types de données, et inversement.

Sur iPhone, les (UIView)Contrôleurs sont surtout présents pour gérer plus facilement les différentes vues. Les modèles sont surtout symbolisés par des objets, dérivés de NSObject (ou autre). Par exemple si vous souhaitez animer un personnage dans une scène, ce dernier devrait avoir son modèle (qui contient sa position, sa vie, sa vitesse, etc) et sa vue (comment il est dessiné). Derrière c’est le Controller qui s’occupe de mélanger les deux avec les autres éléments de la scène.

II] Créer et initialiser un UIViewController

Comme dans bien d’autres cas, nous créons une nouvelle classe que nous dérivons. Ici notre exemple se portera sur le passage d’une vue “Hello World” à une autre en utilisant le contrôler. Afin de ne pas introduire trop d’autres concepts en même temps, nous utiliserons des signaux pour effectuer ces transitions (on fera un rapide rappel sur leur utilisation). Comme nous codons “from scratch”, nous n’utiliserons pas l’outil “drag & drop” pour créer des vues avec la souris.

Définition du UIViewController

Commençons par le header du UIViewController. Le but de cette classe est de gérer deux UIView que nous créerons plus tard. Assumez juste le fait qu’elles existent, deux UIView simples. Voici une déclaration du fichier .h la plus simple qu’il soit :

#import
#import "HelloWorld1View.h"
#import "HelloWorld2View.h"

@interface HelloWorldController : UIViewController {

	HelloWorld1View *myHelloWorldView1;
	HelloWorld2View *myHelloWorldView2;

}
- (void)loadHelloWorld1;
- (void)loadHelloWorld2;
- (void)removeHelloWorld1;
- (void)removeHelloWorld2;

@end

Voici une petite explication de ce qu’on a ci-dessus :

  • Le “#import” permet d’éviter d’inclure plusieurs fois le même fichier s’il a déjà été inclut précédemment.
  • Deux variables correspondant chacune à une des vues dont il était question.
  • Deux méthodes load et deux méthodes remove, une pour chaque vue que l’on possède

Il serait possible d’aller plus loin dans ce fichier, mais pour faire simple on en restera là ! Toutefois nous allons aussi utiliser des signaux pour passer d’une vue à une autre. On pourrait passer par d’autres moyens (ils sont nombreux), mais pour éviter d’apporter trop de notions d’un coup on fera avec ce qui nous parait le plus “simple”. Ainsi on va ajouter deux méthodes : chacune permettant d’aller d’une vue à une autre.

#import "HelloWorld1View.h"
#import "HelloWorld2View.h"

@interface HelloWorldController : UIViewController {

	HelloWorld1View *myHelloWorldView1;
	HelloWorld2View *myHelloWorldView2;

}
- (void)loadHelloWorld1;
- (void)loadHelloWorld2;
- (void)removeHelloWorld1;
- (void)removeHelloWorld2;

- (void)helloworld1TOhelloworld2:(NSNotification *)pNotification;
- (void)helloworld2TOhelloworld1:(NSNotification *)pNotification;

@end

Le petit “(NSNotification *)pNotification” est nécessaire car cela sera des méthodes attachées à des signaux. Nous verrons ça dans l’implémentation un peu plus tard.

III] Implémenter un UIViewController

Voyons maintenant le gros du code source.

Une implémentation nue du UIViewController

Avant d’ajouter nos propres bouts de codes, voyons quelques méthodes déjà présentes que nous n’avons pas besoin de déclarer. Comme nous n’utilisons pas les fichiers NIB (permettant de créer des UIView via l’éditeur graphique), nous aurons une méthode “init” simple. Selon votre manière de programmer vous n’êtes pas obligé de vous servir de toutes les méthodes disponibles, ni forcément de programmer exactement dans les zones appropriées, mais c’est conseillé.

#import "HelloWorldController.h"

@implementation HelloWorldController

// Init UIViewController
- (id)init {

	if (self = [ super init ]) {

		// If init succeed, do some work

	}
	return self;

}

// Implement some work when the view is loading
- (void)loadView {

	// Do some work

}

// Implement some work when the view is loaded
- (void)viewDidLoad {

	// Do some work
	[super viewDidLoad];

}

// Implement some work when the controller received a memory warning
- (void)didReceiveMemoryWarning {

	// Releases the views which aren't used
	[super didReceiveMemoryWarning];

}

// Implement some work when the view is unloaded
- (void)viewDidUnload {

	// Do some work

}

// Dealloc
- (void)dealloc {

	[super dealloc];

}

@end

J’ai laissé quelques commentaires pour chacune des méthodes. Et en principe leur nom est assez explicite. Prenez bien en compte que chaque UIViewController possède sa propre UIView dans [ self view ]. Les méthodes du type loadView, viewDidLoad ou viewDidUnload y font référence. Mais comme ici on souhaite faire au plus simple pour vous embrouiller le moins possible, on va procéder de manière un peu plus “simple” (ou barbare, c’est selon votre vision des choses ^^), et on n’utilisera que les méthodes init et dealloc. On obtient alors l’architecture de base suivante :

#import "HelloWorldController.h"

@implementation HelloWorldController

// Init UIViewController
- (id)init {

	if (self = [ super init ]) {

		// If init succeed, do some work

	}
	return self;

}

// Dealloc
- (void)dealloc {

	[super dealloc];

}

@end

Toutefois si un jour vous cherchez les autres méthodes, vous les aurez :-]

Charger une UIView

Commençons par voir comment ajouter une UIView dans le contrôleur. Cela va nous permettre de remplir les méthodes load pour chacune des UIView.
On part du principe que votre vue n’est pas encore allouée en mémoire et qu’elle prendra la taille de l’écran. Juste allouée l’espace nécessaire à votre vue revient à faire :

myView = [ [ ViewClass alloc ] initWithFrame: [[UIScreen mainScreen] applicationFrame] ];

La commande “[[UIScreen mainScreen] applicationFrame]” renvoie un CGRect (soit ici 320,480 : la dimension de l’écran de l’iPhone/iPod). Si votre vue est plus petite, indiquez lui les bonnes dimensions. Il est important de préciser quelque chose de juste car lorsque votre vue est rafraichie cela évite de rafraichir une zone non utilisée.
Puis il faut ajouter la vue à la vue du contrôleur. Rien de plus simple :

[ self.view addSubview:myView ];

Toutefois attention, myView possède actuellement un retainCount de +2 (+1 après l’alloc, et +1 après le addSubView). Selon la manière dont vous désallouer la mémoire, il faut le prendre en compte pour éviter d’avoir des leaks dans votre application. Ici on va release notre pointeur pour n’avoir qu’une seule action à faire par la suite, ainsi le “retainCount” revient à 1 :

[ myView release ];

Attention à bien le faire après le addSubView, sinon vous aurez quelques soucis…
Et enfin il nous reste à ajouter un signal pour transiter d’une vue à une autre. Pour faire simple, un signal nous permet d’indiquer n’importe où et n’importe quand dans le programme qu’on souhaite effectuer une action. Il suffit de donner un nom au signal, et l’attacher à une méthode.

[[NSNotificationCenter defaultCenter]
	addObserver:self selector:@selector(view2otherview:) name:@"go2otherview" object:nil];

On indique la méthode (ici view2otherview) et son nom (par exemple prenons go2otherview). Sachant que view2otherview doit être déclarée dans le .h avec le petit “(NSNotification *)pNotification” dont on parlait plus haut.

Donc si on résume l’ajout d’une vue se résume à ce bloc :

// Signal
[[NSNotificationCenter defaultCenter]
	addObserver:self selector:@selector(view2otherview:) name:@"go2otherview" object:nil];

// Load View
myView = [ [ ViewClass alloc ] initWithFrame: [[UIScreen mainScreen] applicationFrame] ];
[ self.view addSubview:myView ];
[ myView release ];

Ainsi pour notre exemple, charger une des UIView revient à appeler la fonction loadHelloWorld1 ou loadHelloWorld2 qui ressemble à ça :

- (void)loadHelloWorld1 {

	// Signal
	[[NSNotificationCenter defaultCenter]
		addObserver:self selector:@selector(helloworld1TOhelloworld2:)
		name:@"go2helloWorld2" object:nil];

	// Load View
	myHelloWorldView1 = [ [ HelloWorld1View alloc ] initWithFrame:
							[[UIScreen mainScreen] applicationFrame] ];
	[ self.view addSubview:myHelloWorldView1 ];
	[ myHelloWorldView1 release ];

}

Pour la méthode “loadHelloWorld2″ vous n’avez qu’à remplacer ce qu’il faut dans le signal et dans l’allocation, ça vous fera un exercice pour voir si vous avez bien compris :-]

Enlever une UIView

Maintenant le contraire : comment retirer une vue une fois qu’elle a été ajouté. C’est bien plus rapide que pour l’ajouter.
Dans un premier temps on “remove” la view de sa vue parente. On avait fait un addSubView pour l’ajouter, on fait maintenant un removeFromSuperview pour l’enlever. Cela nous donne :

[ myView removeFromSuperview ];
myView = nil;

On met le pointer myView à nil afin d’être sûr qu’il ne reste plus de trace de l’ancienne allocation mémoire.
Et ne pas oublier de bien retirer le signal. Un signal ne disparait pas comme ça, il faut lui signaler qu’il ne sert plus à rien :

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"go2otherview" object:nil];

En principe il n’y a pas besoin d’autre chose pour notre cas. Il ne reste plus qu’à intégrer ceci dans une méthode :

- (void)removeHelloWorld1 {

	// Remove Signal
	[[NSNotificationCenter defaultCenter] removeObserver:self name:@"go2helloWorld2" object:nil];

	// Remove View
	[ myHelloWorldView1 removeFromSuperview ];
	myHelloWorldView1 = nil;

}

Comme pour le loadHelloWorld2, vous devriez pouvoir faire la méthode removeHelloWorld2 vous-même si vous avez bien compris :-]

Passer d’une vue à une autre

Maintenant que nos fonctions load et remove sont fonctionnelles, il ne nous reste plus qu’à les utiliser. Voyons l’implémentation de la méthode “helloworld1TOhelloworld2″ qui sera appelée via le signal. En fait il n’y a pas grand chose à faire pour une implémentation simple et sans “effet” de transition. Il suffit d’appeler la fonction loadHelloWorld2 et la fonction removeHelloWorld1.

- (void)helloworld1TOhelloworld2:(NSNotification *)pNotification {

	[ self loadHelloWorld2 ];
	[ self removeHelloWorld1 ];

}

Pour aller plus loin vous pouvez tenter d’ajouter des transitions d’UIView. On n’abordera pas ce sujet ici pour éviter de trop rallonger le billet ^_^

Init et dealloc…

On aurait pu commencer par ça, mais il aurait fallut parler de variables non déclarées. L’initialisation du UIViewController se fait vraiment facilement. Il suffit de rajouter un petit “loadHelloWorld1″ dans la méthode déjà précisée ci-dessus :

// Init UIViewController
- (id)init {

	if (self = [ super init ]) {

		[ self loadHelloWorld1 ];

	}
	return self;

}

Et enfin la méthode dealloc ne contient pas non plus grand chose. Si un des pointers est non nil, alors la UIView est toujours présente, dans ce cas on la remove…

// Dealloc
- (void)dealloc {

	if (myHelloWorldView1 != nil)
		[ self removeHelloWorld1 ];
	if (myHelloWorldView2 != nil)
		[ self removeHelloWorld2 ];
	[super dealloc];

}

Code complet

Pour les gens qui aimeraient vérifier le code du UIViewController en un clin d’oeil, le voici en entier :-]

#import "HelloWorldController.h"

@implementation HelloWorldController

// Init UIViewController
- (id)init {

	if (self = [ super init ]) {

		[ self loadHelloWorld1 ];

	}
	return self;

}

// Load the first view
- (void)loadHelloWorld1 {

	// Signal
	[[NSNotificationCenter defaultCenter]
		addObserver:self selector:@selector(helloworld1TOhelloworld2:)
		name:@"go2helloWorld2" object:nil];

	// Load View
	myHelloWorldView1 = [ [ HelloWorld1View alloc ] initWithFrame:
							[[UIScreen mainScreen] applicationFrame] ];
	[ self.view addSubview:myHelloWorldView1 ];
	[ myHelloWorldView1 release ];

}

// Load the second view
- (void)loadHelloWorld2 {

	// Signal
	[[NSNotificationCenter defaultCenter]
		addObserver:self selector:@selector(helloworld2TOhelloworld1:)
		name:@"go2helloWorld1" object:nil];

	// Load View
	myHelloWorldView2 = [ [ HelloWorld2View alloc ] initWithFrame:
							[[UIScreen mainScreen] applicationFrame] ];
	[ self.view addSubview:myHelloWorldView2 ];
	[ myHelloWorldView2 release ];

}

// Remove the first view
- (void)removeHelloWorld1 {

	// Remove Signal
	[[NSNotificationCenter defaultCenter] removeObserver:self name:@"go2helloWorld2" object:nil];

	// Remove View
	[ myHelloWorldView1 removeFromSuperview ];
	myHelloWorldView1 = nil;

}

// Remove the second view
- (void)removeHelloWorld2 {

	// Remove Signal
	[[NSNotificationCenter defaultCenter] removeObserver:self name:@"go2helloWorld1" object:nil];

	// Remove View
	[ myHelloWorldView2 removeFromSuperview ];
	myHelloWorldView2 = nil;

}

// Switch from the first to the second view
- (void)helloworld1TOhelloworld2:(NSNotification *)pNotification {

	[ self loadHelloWorld2 ];
	[ self removeHelloWorld1 ];

}

// Switch from the second to first view
- (void)helloworld2TOhelloworld1:(NSNotification *)pNotification {

	[ self loadHelloWorld1 ];
	[ self removeHelloWorld2 ];

}

// Dealloc
- (void)dealloc {

	if (myHelloWorldView1 != nil)
		[ self removeHelloWorld1 ];
	if (myHelloWorldView2 != nil)
		[ self removeHelloWorld2 ];
	[super dealloc];

}

@end

IV] Les UIView utilisées

Faisons un petit tour sur les deux UIView que nous utilisons. On fera simple, les deux fichiers seront identiques à peu de choses près. Si vous avez manqué notre billet sur les UIView, c’est par ici.

Voici le code du header (.h)

@interface HelloWorld1View : UIView {

	UILabel *labelHello;

}

@end

Et enfin l’implémentation (.m)
Nous envoyons le signal lorsqu’il y a eu un clic d’effectué sur la vue. Vous cliquez, cela change de vue, de manière infinie. Libre à vous ensuite d’implémenter cela comme bon vous semble :-]

#import "HelloWorld1View.h"

@implementation HelloWorld1View;

-(id)initWithFrame : (CGRect)frame {

	if(self = [ super initWithFrame : frame ]) {

		// Background color (white)
		[ self setBackgroundColor:[ UIColor colorWithWhite:0.0 alpha:0.3 ] ];

		// Label
		labelHello = [[ UILabel alloc ] initWithFrame:CGRectMake(80, 190, 120, 45) ];
		[ labelHello setBackgroundColor: [ UIColor colorWithWhite:0.0 alpha:0.0 ] ];
		[ labelHello setTextColor: [ UIColor colorWithWhite:0.0 alpha:1.0 ] ];
		[ labelHello setTextAlignment: UITextAlignmentCenter ];
		[ labelHello setFont: [ UIFont fontWithName:@"Marker Felt" size:22.0 ] ];
		[ labelHello setText: @"Hello World !\n" ];
		[ labelHello setAutoresizesSubviews:TRUE ];

		// Add the label to the view and release it
		[ self addSubview:labelHello ];
		[ labelHello release ];

	}

	// Return the view
	return self;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

	[[NSNotificationCenter defaultCenter] postNotificationName:@"go2helloWorld2" object:nil];
	[ super touchesEnded: touches withEvent: event ];

}

- (void)dealloc {

	NSLog(@"\tDealloc");
	[ labelHello release ];
	[ super dealloc ];

}

@end

Pour la deuxième vue, dupliquez le même code en remplaçant HelloWorld1View par HelloWorld2View, en modifiant la ligne “[ labelHello setText:@”” ]” pour y mettre un autre texte et enfin en changeant le signal envoyé. Rien de bien compliqué si vous avez compris l’autre billet, on ne fait ici qu’afficher une UIView avec un Label dedans.

Si ce billet vous a été utile ou si vous avez une question / un commentaire, n’hésitez pas :-]

Commentaires (23)
  1. Arkos le 4 Mar 2010 à 11:29

    Je viens de me lancer dans la programmation iphone et c’est le premier tutorial que je trouve qui ne fait pas appel immédiatement à interface builder. Le résultat est peut être moins instantané mais à mes yeux beaucoup plus formateur.
    Merci beaucoup pour vos tutorial!

  2. Vinz le 4 Mar 2010 à 14:11

    Hello
    De rien :-)
    Effectivement au début j’ai beaucoup galéré à trouver des tuto qui n’utilisent pas IB. Pour ça il faut acheter des bouquins etc, et surtout galérer très longtemps ^^
    A+ !

  3. RaymondLaNonScience le 13 Mar 2010 à 16:41

    Bravo pour votre tutorial et aussi pour celui sur le UIView. C’est vrai qu’au début c’est la grosse galère, mais petit à petit ça progresse et alors on devient très contant.
    Juste une question de novice: je dois faire passer un nom d’objet (une string) lorsque j’appelle ma vue depuis le controller et je voudrais recevoir cette information dans l’initialisation de la vue :

    code depuis le controller :
    ?

    récéption sur la vue:
    – (id) (id)initWithFrame:(CGRect)frame …(NSString) monObjet

    puis j’utilisera monObjet dans la vue (ça , je sais).

    Merci

  4. Vinz le 14 Mar 2010 à 11:10

    Hello !

    Merci :-)
    Alors pour ton soucis, voici comment redéfinir ta vue dans son .h :
    – (id)initWithFrame:(CGRect)frame andWithBibi:(NSString *)bibi;
    Ou ici “bibi” est le nom de ta variable. Tu peux remplacer “andWithBibi” par ce que tu veux bien sur :-) et “bibi” aussi ^^.
    N’oublie pas le pointer “*” de NSSTring !
    Et pour l’appel tu fais quelque chose du genre :
    [ [ Controller alloc ] initWithFrame:myFrame andWithBibi:@”Ma chaine” ]; :-)

    A+ !
    Vinz

  5. RaymondLaNonScience le 18 Mar 2010 à 00:22

    Salut,

    merci beaucoup pour ton conseil. Je m’y mets de suite et encore une fois bravo pour ta démarche de tutor !!! C’est très sympas et ça encourage d’entrer complètement dans ce monde de l’Iphone et du Mac (et du futur Ipad).
    A+ et encore merci pour le coup de main.
    Raymond

  6. Vinz le 18 Mar 2010 à 11:05

    Merci :-)

    On en fera d’autres bientôt sur iPhone/iPad, faut juste qu’on prenne le temps d’en écrire :-)

    A+ !

  7. james le 24 Mar 2010 à 12:31

    bonjour j’aurais voulu savoir qu’est ce que vous entendez par signal ( une tap sur l’écran …) j’attends mon mac et je vais faire ce tuto qui est compréhensible et formateur je pense pour une premières approche merci

  8. Vinz le 24 Mar 2010 à 14:05

    Hello !
    Merci :-)
    Alors par Signal j’entends Notification (avec NSNotification). Cela permet d’appeler des fonctions qui ne sont en principe pas atteignable ^^
    On fera d’autres tuto iPhone bientôt :-)
    A+ !

  9. Meda le 8 Jun 2010 à 15:32

    Hello,
    alors je vais jouer joyeusement mon role de relou qui commence en objC et qui comprend pas,
    J’ai bien suivie pas à pas le tuto mais lorsque je compile rien ne se passe et je n’arrive tracer que dalle dans la console si ce n’est au niveau du AppDelagate.
    Dois je faire un addSubview dans la méthode “didFinishLaunchingWithOptions”? ou est ce que dans le controller le init s’en charge déjà? Comprends pas, au début c’est ensuite çà bug et la on perd toute confiance.

  10. Vinz le 8 Jun 2010 à 15:40

    Hello !
    Sans voir ton code en entier j’aurais du mal à te dire exactement d’ou vient l’erreur ^^
    Je te conseille de suivre notre dernier tuto pour faire abstraction de IB ( http://www.geckogeek.fr/comment-creer-un-projet-iphone-ipad-avec-xcode-from-scratch.html ) puis de suivre ce tuto.
    Ou sinon dans le pire des cas tu envoie ton projet zippé à contact _at_ geckogeek.fr et je te dis ton erreur 😉
    A+ !

  11. Will le 14 Oct 2010 à 11:45

    Hello,
    Tout d’abord merci pour ce tuto.
    J’ai un petit soucis lors de l’exécution du code, rien de se passe à l’écran alors qu’en debug on passe bien dans les différentes méthodes (init du controleur puis chargement de la vue loadHelloWorld1).
    Je pense qu’il me manque qqc au niveau du code du delegate, j’ai essayé d’instancier le controleur puis d’appeler la méthode addsubview mais rien….ci-dessous le code de mon delegate (methode didFinishLaunchingWithOptions) :
    self.window = [ [ [ UIWindow alloc ] initWithFrame:[ [ UIScreen mainScreen ] bounds ] ] autorelease];
    myController = [[MyViewsController alloc] init];
    [ window addSubview:myController.view ];
    [window makeKeyAndVisible];
    Une idée?
    Will

  12. Vinz le 15 Oct 2010 à 18:58

    Hello,
    Bizarre, le code du delegate semble normal.
    Ca vient peut-être d’une autre configuration.
    Si vous m’envoyez le projet (zippé) à contact@geckogeek.fr je pourrai y jeter un oeil rapide et comprendre plus facilement le soucis 😉
    Bonne soirée
    Vincent

  13. Hervé le 7 Dec 2010 à 22:49

    Bravo et merci.
    Petite question, si je desire passer d’une vue à l’autre par un clic sur bouton (j’ai déclaré celui-ci, il apparaît bien etc.
    Quelle commande utiliser pour appeler la vue2 à partir de la vue 1?
    “Helloworld1TOhelloworld2″ ne suffit pas?
    excusez mon ignorance et encore bravo!
    bonsoir
    Hervé

  14. Vinz le 7 Dec 2010 à 23:26

    Hello,
    Pour cela il faut pouvoir appeler la fonction de la classe principale. Si le bouton est dans un sous-fichier / classe, tu n’as pas de pointeur (ou d’accès) vers ce dernier. Ici on montre la méthode avec des Notification, mais on va bientôt faire un tuto qui explique le principe de delagate qui y aide grandement :-)
    Donc cela dépend ou est ton bouton ?
    A+ !

  15. Herve le 8 Dec 2010 à 11:35

    En réponse à la tienne (7 dec 23:26) “ou est ton bouton?” j’ai suivi l’exemple à la lettre donc le bouton est au même niveau créé dans “initwithframe” en même temps que le label et comme le label déclaré dans le .h.

    Merci
    Hervé

  16. Vinz le 8 Dec 2010 à 13:39

    Oui ok j’ai compris ta question. SI tu désires aller à l’autre view il faut utiliser (dans ce cas) “[[NSNotificationCenter defaultCenter] postNotificationName:@”go2helloWorld2″ object:nil];” En gros tu utilise une méthode d’event sur ton bouton et dedans tu appelles cette notification.

  17. Herve le 8 Dec 2010 à 13:59

    Ok c’est très clair!
    Super et Merci

  18. Hervé le 9 Dec 2010 à 23:05

    Bonsoir,

    J’ai suivi tes indications tout est OK
    Un petit problème j’ai déclaré une UIView (voir le code ci-dessous) mais celle-ci se dessine décalée de quelques 30/40 points verticalement, c’est à dire que j’ai une bande noire entre le haut de ma vue et la barre horaire du haut de l’écran.
    Une petite idée d’où cela peut venir.

    Merci beaucoup

    – (void) loadFabricView {
    // Signal
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fabricViewToSetupView:) name:@”go2Setup” object:nil];

    // Load View
    fabricView = [ [ FabricView alloc ] initWithFrame:[[UIScreen mainScreen] applicationFrame] ];

    [ self.view addSubview:fabricView ];
    [ fabricView release ];

    }

  19. Vinz le 10 Dec 2010 à 15:52

    Hello
    Il faut que tu règle manuellement la frame de frabricView 😉
    Si elle se décale de 30,40 pixels c’est à cause de “frabricView.frame.origin”.
    Donc la meilleure solution c’est que tu indiques toi même des valeurs dans initWithFrame avec CGRectMake() 😉
    A+

  20. Hervé le 10 Dec 2010 à 17:13

    Rien à dire t’es l’meilleur.
    ca marche impec.
    Merci

  21. alain le 9 Feb 2011 à 16:48

    Excellent exemple encore
    mais j’ai un petit souci
    lorsque je click sur la souris le programme sort de l’application
    et ne chaine pas sur la fenetre2
    merci

  22. Vinz le 9 Feb 2011 à 17:13

    Vérifie si le lien (l’event) sur le bouton en question pointe bien sur la bonne fonction. Cela arrive s’il tente d’appeler une méthode qui n’existe pas. Ou alors cela provient de la méthode appelée 😉 Essaye d’ajouter quelques NSLog pour localiser l’erreur.

  23. Lya le 13 Feb 2011 à 11:40

    En plus des NSLog pour cibler l’erreur, est-ce qu’il y a un message d’erreur dans la console quand l’application quitte ? Ca donnera peut-être une indication supplémentaire.


Laisser un commentaire