Articles taggés avec 'Objective-C'
Je voudrais montrer et de discuter quelques exemples sur la façon d'ajouter et de manipuler les propriétés en Objective-C de classe. : Un exemple classique, précisément, est la suivante: dans la définition de notre interface de classe, nous définissons deux propriétés nome et cognome :
e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: Dans le fichier d'implémentation, nous insérons la déclaration @synthesize afin que Xcode va produire pour nous des méthodes getter et setter , respectivement, utilisé pour lire et définir nos deux propriétés:
1 2 3 4 5 6 7 8
| / / MyClass.m # Import "MyClass.h"
@ Mise en œuvre MyClass
Résumer le nom @, le nom de famille;
@ Fin |
, possiamo scrive: Lorsque vous allez utiliser notre classe MyClass , c'est à ce moment istanziaremo un objet de type MyClass , on peut écrire:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| / / Tout autre classe, comme appDelegate / / Dans le fichier. H # Import <UIKit/UIKit.h> # Import "MyClass.h" @ Classe TestViewController; NSObject <UIApplicationDelegate> { TesAppDelegate Interface @: NSObject {<UIApplicationDelegate> UIWindow * fenêtre; * TestViewController viewController; MyClass * myClass; } / / Dans le fichier. M MyClass alloc ] ; myClass = [MaClasse alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome); |
Ou, ce qui équivaut à:
1 2 3
| / / Toujours dans le fichier. M @ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass nom]); |
Jusqu'ici tout va bien. Toutefois, il pourrait induire en erreur l'équivalence des "variabli" interne (Ivar) comme des biens immobiliers. Pour comprendre la différence, proposer à nouveau la même chose que faire sans, cette fois, le @synthesize . . Maintenant, donc, nous devrions traiter avec nous pour écrire les méthodes getter et setter . Afin de mieux souligner les différences, les variables internes rinominerò insérant un trait de soulignement devant le nom. Mais nous voyons le code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # Import <Foundation/Foundation.h> NSObject { @ Interface MaClasse: NSObject { _nome; NSString * _Nom; _cognome; NSString * _cognome; } NSString * ) nome; // get - ( NSString *) nom; / / récupère NSString * ) cognome; // get - ( NSString *) nom; / / récupère void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set @ Fin |
. Contrairement à l'exemple précédent, les pointeurs vers les variables internes (incapsultate) sont devenus _nome et _cognome . . @property è scomparso, in quanto non serve più. En outre, il existe quatre définitions de méthodes qui représentent notre get et set . @property a disparu, ne sont plus nécessaires.
Nous voyons le fichier d'implémentation MyClass.m :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # Import "MyClass.h" @ Mise en œuvre MyClass / / Obtenir un "nom" NSString * ) nome { - ( NSString *) nom { _Nom Retour; } / / Set pour "nom" void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _Nom = StringaIngresso; } / / Obtenir de "nom" NSString * ) cognome { - ( NSString *) nom { _cognome revenir; } / / Set pour "Last Name" void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ Fin |
Une classe de sorte écrite peut être utilisé exactement comme le précédent, à savoir:
1 2 3 4 5 6 7 8
| MyClass alloc ] ; myClass = [MaClasse alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome);
/ / Ou, ce qui équivaut à:
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass nom]); |
e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Au niveau de la négligence éducative @synthesize nous a forcés à écrire "leurs propres" méthodes get et set , en soulignant - même avec l'ajout dell'underscore - les différences entre le nom de la propriété et son Ivar interne _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. À un niveau fonctionnel à l'usage personnel des méthodes get et set permet un contrôle réel des données avant sa mise (ou avant sa lecture), puis une encapsulation réelle afin de protéger la variable interne.
Par exemple, il serait possible d'empêcher le passage des chaînes vides à la propriété nome :
1 2 3 4
| void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name"; _Nom = StringaIngresso; } |
Autre variante
Si vous souhaitez utiliser les variables internes avec le trait de soulignement en face (qui rpoviene Adobe ActionScript pourrait être utilisé aussi bien) n'est pas nécessaire d'abandonner l'utilisation de la directive @synthesize . Xcode permet de "fusionner" les méthodes ci-dessus:
1 2
| _nome; @ Name = Synthétiser _Nom; _cognome; @ Name = Synthétiser _cognome; |
. Ce faisant, nous pourrions utiliser en interne pointeur _nome ", résume" - à l'extérieur - comme une propriété nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . En outre, bien que l'utilisation de @synthesize produit méthodes de génération automatique (messages) de getter et setter , est également vrai que ce n'est que si elle les trouve, donc si vous voulez "mettre en œuvre" une méthode pour votre getter et / ou setter peut le faire même si vous avez utilisé la directive @synthesize .
Les allocations de mémoire
Dans les exemples qui précèdent, j'ai omis certains détails importants pour une mise en œuvre réelle. Tout d'abord, je n'ai pas montré toute méthode init() , utile pour l'initialisation d'objet et les valeurs par défaut. De plus, il manque l'addition d'un procédé dealloc() :
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
| / / Fichier MyClass.m # Import "MyClass.h" @ Mise en œuvre MyClass id ) init { - (Id) {init self = [ super init ] ) { if (self = [super init]) { "Nome preimpostato" ; _Nom @ = "Nom du paramètre prédéfini"; "Cognome preimpostato" ; _cognome @ = "Nom du paramètre prédéfini"; } retourner soi-même; } void ) dealloc { - (Void) dealloc { ; [_Nom De presse]; ; [_cognome De presse]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) nom { _Nom Retour; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name"; _Nom = StringaIngresso; } NSString * ) cognome { - ( NSString *) nom { _cognome revenir; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ Fin |
, etc… Dans l'avenir, nous verrons ensuite les détails sur les propriétés readonly , retain , etc ... 
En savoir plus ...
Tant le Mac OS X que l'OS iPhone, nous pouvons accéder facilement et directement à l'annuaire - le plus important - le système qui sont:
1 2 3
| NSHomeDirectory Retourne le chemin vers le répertoire home de l'utilisateur actuel. Retourne le chemin NSHomeDirectoryForUser Étant donné le répertoire home de l'utilisateur. NSTemporaryDirectory Retourne le chemin du répertoire temporaire pour l'utilisateur actuel. |
En savoir plus ...
o CGPoint , ad esempio. La syntaxe NSLog(@"%@", ... ); qui fonctionne et est utilisé pour obtenir des informations sur les objets, mais ne fonctionne pas sur les types de données tels que C struct CGRect ou CGPoint , par exemple. o NSStringFromCGPoint : Pour profiter de NSLog(@"%@", ... ); également de style C structs nous pouvons nous appuyer sur les fonctions de conversion telles que NSStringFromCGRect() ou NSStringFromCGPoint :
1 2 3 4 5
| CGRect ) { 10 , 20 , 30 , 40 } ; CGRect mioRect = (CGRect) {10, 20, 30, 40}; CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; / / "Info rettangolo: %@" , NSStringFromCGRect ( mioRect ) ) ; NSLog (@ "rectangle Info:% @", NSStringFromCGRect (mioRect)); "Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "point info:% @", NSStringFromCGPoint (mioPoint)); |
Plus précisément, il est possible d'affiner les procédures correspondantes de petites macros utiles comme:
1
| # Définir NSLogRect (rect) NSLog (@ "% s (% 0.0f, 0.0f%) 0.0f%% 0.0fx", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height) |
Ou:
1 2 3 4
| # Définir NSLogCGPoint (point) NSLog (@ "% s (% 0.0f, 0.0f%)", # Point.X point, Point.y)
CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; ; NSLogCGPoint (mioPoint); |
Cela vous donnera en sortie:
1
| 32 , 64 ) mioPoint: (32, 64) |
En savoir plus ...
XCode est un environnement de développement très puissant et se réserve quelques surprises. Il permet à une fonction similaire à la "snippet" de la célèbre éditeur TextMate . En pratique, il est possible d'insérer des blocs de code en utilisant la séquence ESC + une combinaison d'un ou de plusieurs séquences de caractères. e otterrete: Par exemple, si vous souhaitez insérer un bloc if essayez d'appuyer sur ESC+if et vous obtiendrez:

. Comme le montre la figure, un menu apparaît (le même auto-complétion) où vous pouvez choisir entre un simple bloc if ou if/else . En cliquant sur "envoyer", vous obtenez:

Voici deux liens pour la liste complète des raccourcis clavier:
En savoir plus ...
Si vous avez besoin pour générer des nombres aléatoires dans une application doivent mettre de côté l'iPhone d'Apple Objective-C, car il ne propose pas de l'ordre des classes. La solution est proposé que le dossier C: rand(), srand(), random(), srandom() e arc4random() .
En savoir plus ...
Normalement, un événement, qui n'est rien d'autre qu'un message est fixe (fixé et mis en œuvre) dans la même classe ou le contexte, la fonction ou la procédure "d'appel". o in un UIViewController . Par exemple, si nous ajoutons un bouton UIButton via le code (programme), nous pouvons trouver notre classe dans un UIView ou un UIViewController . Dans les deux cas, la répartition des tâches et l'initialisation de la touche sera suivie par la fixation de target qui devraient recevoir un message quand il "clics" sur le bouton, tapez:
1 2 3 4 5 6 7 8 9
| [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton * bouton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30); @ "Press me" forState : UIControlStateNormal ] ; [Bouton setTitle: @ "moi Appuyez sur" forState: UIControlStateNormal]; / / Décidez qui devrait recevoir le message d'UIControlEventTouchUpInside self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; [Bouton AddTarget: action d'auto: @ selector (onButtonClicked) forControlEvents: UIControlEventTouchUpInside]; / / ... void ) onButtonClicked { - (Void) {onButtonClicked / / ... } |
Ligne 5 du code ci-dessus qui décide qui (sous réserve) et ce (méthode) "appel" lorsque notre bouton est pressé. Dans l'exemple illustré ci-dessus est également connu que le réglage de la pression du message est envoyé à la méthode onButtonClick mise en œuvre ci-dessous, puis faisant partie du même contexte (ou classe). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. La première considération est évident que nous pouvons faire, alors, est que, en modifiant les paramètres self et de action , nous pouvons envoyer notre message à tout autre objet, puis placez également en dehors du contexte d'utilisation. : Voici un exemple: une classe UIApplicationDelegate créer un UIViewController :
1 2 3 4 5
| / / / / MyAppDelegate.m / / SplashScreenController alloc ] ; splashScreenController = [SplashScreenController alloc]; splashScreenController.view ] ; [Fenêtre addSubview: splashScreenController.view]; |
associata al UIViewController stesso: Le SplashScreenController expose une méthode qui vous permet d'animer le UIView associée à UIViewController même:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| / / / / SplashScreenController.m / / void ) animateBackgroundDown { - (Void) {animateBackgroundDown nil context : nil ] ; [BeginAnimations UIView: contexte nulle: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; self ] ; [UIView setAnimationDelegate: self]; @selector ( onAnimationFinished ) ] ; [UIView setAnimationDidStopSelector: @ selector (onAnimationFinished)]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [CommitAnimations UIView]; } / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "Animation fin"); } |
. Le code ci-dessus montre une méthode définie à l'intérieur de la classe SplashScreenController de type UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Il ne fait rien, mais d'animer le UIView qui l'anime vers le bas, et quand l'animation est terminée, composez le (envoyer un message à lui-même - d'où self ) onAnimationFinished défini ci-dessous, fait partie de la classe toujours SplashScreenController . , non saremo informati della fine dell'animazione: Il s'ensuit que, dans notre myAppDelegate , lorsque nous invoquons la méthode animateBackgroundDown , nous ne serons pas informés de la fin de l'animation:
1 2 3 4
| / / / / MyAppDelegate.m / / ; [SplashScreenController animateBackgroundDown]; |
Ce que nous voulons, au contraire, est de créer une nouvelle version de animateBackgroundDown comme pour lui dire où envoyer l'animation de fin de message et la méthode à appeler. En pratique, nous voulons nous assurer que vous pouvez écrire dans notre classe myAppDelegate :
1 2 3 4 5 6 7 8
| / / / / MyAppDelegate.m / / self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: sélecteur de soi: @ selector (onAnimationFinished)]; / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "Animation fin"); } |
, bensì in myAppDelegate . Cette fois le procédé onAnimationFinished n'est pas dans la UIViewController , mais dans myAppDelegate . nel modo seguente: Pour ce faire il suffit de changer la méthode animateBackgroundDown dans UIViewController comme suit:
1 2 3 4 5 6 7 8 9 10 11 12
| / / / / SplashScreenController.m / / void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) cible sélecteur: (SEL) de sélection { nil context : nil ] ; [BeginAnimations UIView: contexte nulle: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; target ] ; [SetAnimationDelegate UIView: cible]; selector ] ; [UIView setAnimationDidStopSelector: sélecteur de]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [CommitAnimations UIView]; } |
). Maintenant, nous avons une méthode qui accepte le "contexte" ( target ) et la méthode à appeler ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Maintenant, lorsque l'animation se termine, le message AnimationDidStop sera envoyé à myAppDelegate tout autre «objet» / classe qui peut le recevoir.
En savoir plus ...
CGRectMake() est une fonction (en fait une ligne # define) beaucoup utilisé en particulier lorsque des objets sont créés par le code ou d'une interface utilisateur graphique. o UIImageView . CGRectMake() restituisce una struct (struttura di tipo) CGRect : Son utilisation est donc souvent associé composants d'initialisation de UIKit , mais aussi à de simples UIView ou UIImageView . CGRectMake() retourne une struct (type de structure) CGRect :
1 2 3 4 5
| struct {CGRect Origine CGPoint; CGSize taille; }; typedef struct CGRect CGRect; |
: Qui à son tour est composé de deux différents structure CGPoint et CGSize :
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct {CGPoint X CGFloat; CGFloat y; }; typedef struct CGPoint CGPoint;
Tailles * /. * /
struct {CGSize CGFloat largeur; CGFloat hauteur; }; typedef struct CGSize CGSize; |
. Que, à leur tour à nouveau, contiennent des types CGFloat , ou des types float . Si nous analysons le code de CGRectMake () sont les suivants:
1 2 3 4 5 6 7 8
| CG_INLINE CGRect CGRectMake (CGFloat x, y CGFloat, largeur CGFloat, CGFloat hauteur) { CGRect rect; y; rect.origin.x = x; rect.origin.y = y; height; rect.size.width = largeur; rect.size.height = hauteur; retourner rect; } |
Il s'ensuit, donc, que cette partie du code:
1 2 3 4
| [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 12 , 409 , 100 , 40 ) ; gbutton.frame = CGRectMake (12, 409, 100, 40); @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" forState: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Il pourrait à juste titre être écrite comme suit:
1 2 3 4
| [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; CGRect ) { 12 , 409 , 100 , 40 } ; gbutton.frame = (CGRect) {12, 409, 100, 40}; @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" forState: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Juste pour accélérer les choses »le code est exécuté ... 
En savoir plus ...
Xcode est un environnement de développement vraiment bon, agréable et pleine de détails qui rendent l'écriture de code efficace et agréable. Parmi ceux-ci est certainement la commodité d'auto-complétion lors de la frappe, surtout quand l'écriture d'applications pour l'iPhone d'Apple, où les cadres sont nombreux et n'oubliez pas la syntaxe et de la nomenclature a entrepris quelques-uns.
En savoir plus ...
creato. Je veux montrer comment il est possible, dans un simple et rapide, étendre une classe UIView de telle manière qui répond à une nouvelle méthode d'initialisation contenant en outre le code objet pour personnaliser UIView créé. Comme certains d'entre vous le savez probablement, Objective-C ne supporte pas un seul fabricant que dans les langues autres objets orientés (comme Adobe ActionScript ou PHP5). E 'peut, en effet, créer une instance d'une classe manuellement en invoquant différents fabricants (virtuellement infini). . Normalement nous sommes habitués à créer des objets UIView avec le classique initWithFrame . Supposons, cependant, nous voulons créer une nouvelle classe d'objets visuels, à partir d'un UIView , avec une addition, une telle étiquette est incorporé. . Fondamentalement, ce que nous voulons, c'est que l'instanciation de notre objet, il crée, ainsi que la UIView , un objet de type UILabel . Par exemple nous pourrions arriver à la fin:
1
| [ [ ViewLabel alloc ] initWithLabelDefine : CGRectMake ( 0 , 0 , 320 , 80 ) label : @ "Ciao" ] ; ViewLabel * vl = [[ViewLabel alloc] initWithLabelDefine: CGRectMake (0, 0, 320, 80) label: @ "Bonjour"]; |
: Pour ce faire il suffit de créer une nouvelle classe de type UIView et appel ViewLabel :
1 2 3 4 5 6 7 8 9 10 11 12 13
| / / / / ViewLabel.h / / # Import <UIKit/UIKit.h> UIView { @ Interface ViewLabel: UIView { UILabel * internalLabel; } id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine; - (Id) initWithLabelDefine: étiquette d'image (CGRect): ( NSString *) labelDefine; @ Fin |
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
| / / / / ViewLabel.m / / # Import "ViewLabel.h" @ Mise en œuvre ViewLabel id ) initWithFrame : ( CGRect ) frame { - (Id) initWithFrame: (CGRect) {trame self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: frame]) { / / Initialisation du code } retourner soi-même; } / / / / Notre nouvelle initialisation / / id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine { - (Id) initWithLabelDefine: étiquette d'image (CGRect): ( NSString *) {labelDefine self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: frame]) { / / Ici, vous pouvez décider de la façon de se comporter, I pour / / J'ai eu le même cadre de sécurité dans le passé / / Entrée mais je réinitialiser le x et y ; frame.origin.x = 0; ; frame.origin.y = 0; UILabel alloc ] initWithFrame : frame ] ; internalLabel = [[UILabel alloc] initWithFrame: frame]; internalLabel.text = labelDefine; internalLabel ] ; [Self addSubview: internalLabel]; ; [InternalLabel release]; } retourner soi-même; } void ) drawRect : ( CGRect ) rect { - (Void) drawRect: (CGRect) rect { Code / / Dessin } void ) dealloc { - (Void) dealloc { ; [Super dealloc]; } @ Fin |
Au moment de la création de notre nouvelle classe, nous pourrions utiliser:
1
| [ [ ViewLabel alloc ] initWithLabelDefine : CGRectMake ( 0 , 0 , 320 , 80 ) label : @ "Ciao" ] ; ViewLabel * vl = [[ViewLabel alloc] initWithLabelDefine: CGRectMake (0, 0, 320, 80) label: @ "Bonjour"]; |
En savoir plus ...
Comme mentionné iPhone FirstApp: Devinez le nombre - Partie 1 , nous verrons comment faire une demande de l'iPhone d'Apple sans utiliser Interface Builder! En effet, nous allons éliminer les fichiers physiques créés par Interface Builder Xcode assistant. A la fin de ce post, alors, nous avons une demande identique à tous égards, à celles construites dans la première partie, avec la différence que nous allons atteindre tous nos composants visuels, y compris la fenêtre principale, pour le code complet.
L'application déjà fait, si vous voulez juste de télécharger, est disponible sur mon dépôt de Google Code:
Je tiens à souligner d'emblée comme le ZIP de cet exemple pèse moins que la dernière fois! 
Nous créons le projet
Nous commençons par créer notre projet SecondApp (pour le distinguer de FirstApp), mais cette fois choisissez Fenêtre application basée sur:

Maintenant, nous allons supprimer tout ce qui touche à Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Éliminer le fichier MainWindow.xib , situé dans le dossier Resources , le retirer du système de fichiers aussi, et puis sélectionnez Déplacer vers la Corbeille également. nella casella Main nib file base name : Sélectionnez ensuite le fichier SecondoApp-info.plist et supprimer la référence à la MainWindow fichier nib dans le nom de la boîte principale base:

À ce stade, nous n'avons plus aucune fenêtre, au moins par Interface Builder. , e modifichiamo la funzione main() in questo modo: Donc, nous ouvrons le fichier main.m , situé dans Other Sources , et de modifier la fonction main() comme ceci:
1 2 3 4 5 6 7 8 9 10 11
| int argc, char * argv [ ] ) { int main (int argc, char * argv []) { pool = [ [ NSAutoreleasePool alloc ] init ] ; NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc] init]; / / En supprimant le fichier. XIB, nous avons perdu le suivi / / Le délégué app puis la passer à "la main" UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int = retVal UIApplicationMain (argc, argv, nul, @ "SecondAppAppDelegate"); ; [Communiqué de piscine]; retourner retVal; } |
Ouvrez SecondAppAppDelegate.me puis nous créons la fenêtre principale via le code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void ) applicationDidFinishLaunching : ( UIApplication * ) application { - (Void) applicationDidFinishLaunching: (UIApplication *) application {
/ / Retourne la taille de l'écran (320, 480) UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[mainScreen UIScreen] applicationFrame]; / / Créer une fenêtre - comme nous l'avons fait bye bye à Interface Builder [ [ UIWindow alloc ] initWithFrame : windowRect ] ; UIWindow mainWindow * = [[UIWindow alloc] initWithFrame: windowRect]; / / Définit l'arrière-plan de la fenêtre au jaune, à la différence / / Le FirstApp demande antérieure [ UIColor yellowColor ] ] ; [SetBackgroundColor MainWindow: [UIColor yellowColor]];
mainWindow ] ; [Self setWindow: mainWindow]; ; [Fenêtre makeKeyAndVisible];
; [MainWindow release]; } |
Vous pouvez déjà tester l'application, si une fenêtre apparaît en jaune vous avez tout fait correctement!
, necessario solo se si usa Interface Builder. Dans le fichier SecondAppAppDelegate.h nous pouvons éliminer IBOutlet , n'est nécessaire que si vous utilisez Interface Builder. En outre ajouter ici que nos variables globales, la dernière fois nous étions entrés dans le contrôleur. Ensuite, modifiez le fichier SecondAppAppDelegate.h :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # Import <UIKit/UIKit.h> NSObject <UIApplicationDelegate> { SecondAppAppDelegate Interface @: NSObject {<UIApplicationDelegate> UIWindow * fenêtre; UITextField * nombre; UIButton * bouton; int numeroACaso; } nonatomic, retain ) UIWindow * window; @ La propriété (nonatomic, conserver) UIWindow * fenêtre; void ) controllaNumero; - (Void) getNumber; @ Fin |
, in quanto non stiamo usando Interface Builder. Dans ce cas également, nous avons préparé la définition de méthode controllaNumero , comme la dernière fois, mais nous avons éliminé l'indication IBAction , puisque nous ne sommes pas en utilisant Interface Builder.
Nous construisons le code de l'interface
Il est temps de créer un code en utilisant tous les composants de notre interface. ed inseriamo il seguente codice: Nous reviendrons dans le fichier SecondAppAppDelegate.m , posizioniamoci avant [mainWindow release] et insérez le code suivant:
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
| / / Créer la barre de titre [ [ UINavigationBar alloc ] initWithFrame : CGRectMake ( 0.0 , 0.0 , 320.0 , 44.0 ) ] ; UINavigationBar myNavigationBar * = [[UINavigationBar alloc] initWithFrame: CGRectMake (0.0, 0.0, 320.0, 44.0)]; myNavigationBar.barStyle = UIBarStyleDefault; [ [ UINavigationItem alloc ] initWithTitle : @ "Indovina un numero" ] ; UINavigationItem navigationItem * = [[UINavigationItem alloc] initWithTitle: @ "Devinez un certain nombre"]; navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animé: NO]; myNavigationBar ] ; [Fenêtre addSubview: myNavigationBar];
/ / Création de l'étiquette [ [ UILabel alloc ] initWithFrame : CGRectMake ( 10 , 50 , 300 , 80 ) ] ; UILabel MyLabel * = [[UILabel alloc] initWithFrame: CGRectMake (10, 50, 300, 80)]; UIColor clearColor ] ; myLabel.backgroundColor = [UIColor clearColor]; ; myLabel.numberOfLines = 2; "iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?" ; myLabel.text = @ "iPhone a conçu un certain nombre de 1 à 10, essayer de deviner?" myLabel ] ; [Fenêtre addSubview: MyLabel];
/ / Créer la saisie de texte UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; = nombre [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)]; numero.borderStyle = UITextBorderStyleRoundedRect; numero.textAlignment = UITextAlignmentCenter; numero.keyboardType = UIKeyboardTypeNumberPad; "Inserisci il numero" ; numero.placeholder = @ "Entrez le numéro de"; numero ] ; [Fenêtre addSubview: nombre];
/ / Créer le bouton UIButton buttonWithType : UIButtonTypeRoundedRect ] ; button = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30); @ "Premi qui" forState : UIControlStateNormal ] ; [Bouton setTitle: @ "Cliquez ici" forState: UIControlStateNormal]; self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; [Bouton AddTarget: action d'auto: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside]; bottone ] ; [Fenêtre addSubview: le bouton];
; [MyLabel release]; ; [NavigationItem release]; ; [MyNavigationBar release]; |
della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Depuis la « applicationDidFinishLaunching correspond à viewDidLoad que la dernière fois, juste après le [mainWindow release]; insérer:
1
| + arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () est 10%; |
Maintenant, nous pouvons faire est de mettre en œuvre la méthode controllaNumero , qui sera identique (à l'exception du prototype) à celle utilisée la dernière fois:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void ) controllaNumero { - (Void) {getNumber "Premuto bottone di controlla numero" ) ; NSLog (@ "nombre Pressé de contrôle sur le bouton"); [ numero.text integerValue ] ; numeroInserito int = [numero.text integerValue]; message; NSString * message; "Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "Le numéro saisi est% d", numeroInserito); numeroInserito <numeroACaso ) { si (numeroInserito <numeroACaso) { "Troppo basso..." ; message = @ "trop faible ..."; ( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) { "Troppo alto..." ; message = @ "trop élevé ..."; ( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) { "Bravo hai indovinato" ; message = @ "Bravo vous avez deviné"; + arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () est 10%; "Numero pensato %d" , numeroACaso ) ; NSLog (@ "% Nombre d pensé," numeroACaso); } [ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc] "Responso" initWithTitle: @ "Réponse" message: message délégué: néant "OK" cancelButtonTitle: @ "OK" ] ; otherButtonTitles: nil]; ; [AlertMessaggio spectacle]; ; [AlertMessaggio release]; "" ; numero.text @ = ""; } |
Nous en avons terminé!
Conclusions et considérations
, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Cet exemple ne fait pas l'utilisation directe d'un UIView ou UIViewController , parce que je voulais le laisser aussi simple et rationnel que possible et, aussi, de montrer que les éléments ne sont pas toujours nécessaires. Cependant, l'insertion d'objets directement dans la fenêtre peut avoir un certain sens dans cet exemple et d'autres contextes sporadiques. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. L'utilisation de UIView et UIViewController encore apporter des avantages dans de nombreux autres cas, etdans certains sont presque indispensable, comme nous le verrons dans le futur.
En savoir plus ...
Derniers Commentaires
Giovambattista Fazioli : @ Nik: Je suis heureux! Bonne chance alors!
Nik : J'ai lundi l'examen des informations sur java, grâce à moi que vous avez été très utile, le livre que je n'était pas claire ...
Marquez : Merci beaucoup, je l'ai allumé
Je l'ai résolu par la mise en [cc_objc] / / OptionViewController.m - ...
Giovambattista Fazioli : @ Mark: Je vous suggère de réfléchir une approche plus correcte. Si vous exécutez la sous-classe de l'onglet ...
louis : très clair et simple, je dois avouer que rédiger un an à peine utiliser des délégués créés par ...