
Articles taggés avec 'Apple'
Comment définir XCode pour utiliser l'iPhone au lieu du simulateur
iPhone: créer un moyen de réagir aux événements qui traversent la classe
Normalement, un événement, qui n'est rien mais un message est fixe (fixé et mis en œuvre) dans la même classe ou son contexte, la fonction ou la procédure de "caller". o in un UIViewController . Par exemple, si nous ajoutons un bouton UIButton via un code (programmation), 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 l'établissement d' target qui devrait recevoir un message quand il "clique" 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: @ "me presse" Forst: UIControlStateNormal]; / / Décidez qui devrait recevoir le message de UIControlEventTouchUpInside self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; Bouton [AddTarget: action d'auto: @ selector (onButtonClicked) forControlEvents: UIControlEventTouchUpInside]; / / ... void ) onButtonClicked { - (Void) {onButtonClicked / / ... } |
Ligne 5 décide qui le code montré ci-dessus (l'objet) et ce (méthode) "appel" lorsque notre bouton est pressé. Dans l'exemple ci-dessus est également connu que le réglage de la pression du message est envoyé à la méthode onButtonClick œuvre ci-dessous, qui faisait alors 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 de self et de action que nous pouvons envoyer notre message à tout autre objet, puis placer dans le contexte dans difuori 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é à 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 ] ; [SetAnimationDelegate UIView: 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 (@ "L'animation est terminée"); } |
. Le code ci-dessus montre une méthode définie dans la classe SplashScreenController Type UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Il ne fait rien, mais animer le UIView l'animer en bas, et quand l'animation est terminée, composez le (envoyer un message à lui-même - donc 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 nos myAppDelegate , quand 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]; |
Que nous pourrions, au contraire, est de créer une nouvelle version de animateBackgroundDown qui me disent où envoyer le message à la fin de l'animation, et la méthode à appeler. En pratique, nous voulons faire en sorte d'écrire dans notre classe myAppDelegate :
1 2 3 4 5 6 7 8 | / / / / MyAppDelegate.m / / self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: auto sélecteur: @ selector (onAnimationFinished)]; / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "L'animation est terminée"); } |
, bensì in myAppDelegate . Cette fois la méthode onAnimationFinished n'est pas dans le UIViewController , mais dans myAppDelegate . nel modo seguente: Pour ce faire il suffit de changer la méthode animateBackgroundDown de 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) sélecteur { 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]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [CommitAnimations UIView]; } |
). Maintenant nous avons une méthode qui prend 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.
Objective-C: une alternative à l'utilisation CGRectMake
CGRectMake() est une fonction (en fait une ligne # define) utilisé beaucoup surtout quand vous créez des objets graphiques à partir du code ou de l'interface utilisateur. 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 CGPoint origine; CGSize taille; }; typedef struct CGRect CGRect; |
: Qui à son tour est composée de deux différents struct 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 Largeur CGFloat; Hauteur CGFloat; }; typedef struct CGSize CGSize; |
. Cela, en retour, de nouveau, contiennent des types CGFloat ou le type float . Si nous analysons le code de CGRectMake () sont:
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, y = rect.origin.y; height; rect.size.width = largeur, hauteur = rect.size.height; retour rect; } |
Il s'ensuit donc que ce morceau de 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" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Il pourrait à juste titre être écrite comme:
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" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Juste pour accélérer les choses »le code est exécuté ... ![]()
Raccourci Xcode
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 eux se trouve la facilité 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 société de syntaxe et de la nomenclature par quelques-uns.
Xcode: Conseils de débogage sur Préférences
En utilisant les préférences de Xcode, vous pouvez définir le comportement de l'atmosphère pendant la phase de débogage d'une application iPhone. Les paramètres par défaut, en fait, sont très inconfortables lorsque vous essayez et essayez de nouveau une application, par exemple, après le lancement de notre application, vous devez ouvrir manuellement la fenêtre de console pour voir la sortie de divers NSLog() . Xcode permet également aux sessions précédentes, afin de nous forcer à nettoyer la fenêtre à la main. Heureusement, vous pouvez résoudre le problème en agissant sur les préférences:

Comme indiqué ci-dessus, il suffit de sélectionner un élément dans le menu de démarrage de décider quelle fenêtre de débogage à ouvrir automatiquement au démarrage de notre valide si (I & Debugger Console jeu mais vous pouvez choisir ceux que vous convient le mieux). Sur la droite, puis on trouve la console de débogage Auto Clear, vous commencez toujours avec une console propre.
iPhone SecondApp: Devinez le nombre - Partie 2
Comme mentionné iPhone FirstApp: Devinez le nombre - Partie 1 , nous voyons comment faire une application pour 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, à celle obtenue dans la première partie, avec la différence que nous allons atteindre tous nos composants visuels, y compris la fenêtre principale, complètement à code.
L'application déjà fait, si vous voulez juste à télécharger, est disponible sur mon référentiel Google Code:
Je tiens à signaler immédiatement que la ZIP de cet exemple un poids inférieur à la dernière fois! ![]()
Nous créons le projet
Nous commençons par créer notre projet SecondApp (pour la distinguer de FirstApp), mais cette fois choisissez Fenêtre application basée sur:

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

A ce stade, nous n'avons plus de n'importe quel ordinateur Windows, au moins par Interface Builder. , e modifichiamo la funzione main() in questo modo: Nous avons donc ouvrir 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 manqué le point / / Délégué à l'APP, puis le passer à «la main» UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int RETVAL = UIApplicationMain (argc, argv, nul, @ "SecondAppAppDelegate"); ; [Communiqué de piscine]; retour retVal; } |
Ouvrez SecondAppAppDelegate.me puis créer la fenêtre principale dans le code suivant:
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 = [[Ecran UIScreen] applicationFrame]; / / Création d'une fenêtre - comme nous l'avons fait dans Interface Builder bye bye [ [ UIWindow alloc ] initWithFrame : windowRect ] ; MainWindow UIWindow * = [[UIWindow alloc] initWithFrame: windowRect]; / / Définir le fond de la fenêtre au jaune, à différencier / / La 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 vous obtenez une fenêtre jaune vous avez tout fait correctement!
, necessario solo se si usa Interface Builder. Dans le fichier SecondAppAppDelegate.h nous pouvons éliminer IBOutlet , uniquement nécessaire si vous utilisez Interface Builder. Également ajouter ici que nos variables globales, la dernière fois que nous étions entrés dans le contrôleur. Puis modifier 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; numeroACaso int; } nonatomic, retain ) UIWindow * window; @ Property (nonatomic, retenir) UIWindow * fenêtre; void ) controllaNumero; - (Void) getNumber; @ Fin |
, in quanto non stiamo usando Interface Builder. Encore une fois, nous avons préparé la définition de méthode controllaNumero , comme la dernière fois, mais nous avons éliminé l'indication IBAction , parce que vous n'utilisez pas d'Interface Builder.
Nous construisons l'interface à partir du code
C'est le temps de créer du code en utilisant tous les composants de notre interface. ed inseriamo il seguente codice: Revenons au 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éation de 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 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 numéro de 1 à 10, essayez de deviner?" myLabel ] ; [Fenêtre addSubview: MyLabel]; / / Création de 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"; numero ] ; [Fenêtre addSubview: nombre]; / / Créer le bouton UIButton buttonWithType : UIButtonTypeRoundedRect ] ; bouton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30); @ "Premi qui" forState : UIControlStateNormal ] ; [Bouton setTitle: @ "Cliquez Ici" Forst: UIControlStateNormal]; self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; Bouton [AddTarget: action d'auto: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside]; bottone ] ; [Fenêtre addSubview: bouton]; ; [MyLabel release]; ; [NavigationItem release]; ; [MyNavigationBar release]; |
della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Depuis le « applicationDidFinishLaunching correspond à viewDidLoad que la dernière fois, juste après le [mainWindow release]; insérer:
1 | + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; |
Maintenant, nous pouvons faire est de mettre en œuvre la méthode controllaNumero , qui sera identique (à part le prototype) à ce moment-là utilisé en dernier:
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é contrô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 ) { if (numeroInserito <numeroACaso) { "Troppo basso..." ; message = @ "Trop peu ..."; ( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) { "Troppo alto..." ; message = @ "Trop haut ..."; ( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) { "Bravo hai indovinato" ; message = @ "Bravo, vous avez deviné»; + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; "Numero pensato %d" , numeroACaso ) ; NSLog (@ "% d Nombre pensé," numeroACaso); } [ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc] "Responso" initWithTitle: @ "Réponse" message: message déléguée: 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 une utilisation directe d'un UIView ou UIViewController , juste parce que je voulais quitter ce aussi simple et rationnel que possible et, aussi, de montrer que les éléments ne sont pas toujours nécessaires. Toutefois insérer des 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 apporter des avantages dans de nombreux autres cas, cependant, certaines sont pratiquement indispensables ein, comme nous le verrons dans le futur.
XCode: organiser votre code avec la marque # pragma
XCode est un très puissant et polyvalent et permet au programmeur de nombreuses fonctions utiles et simples à utiliser. Lors de l'écriture de code complexe, ou au moins articulées, il devient important d'organiser votre code de sorte que vous ne perdez pas de temps à chercher les fonctions réparties dans les longues lignes de code. Après avoir commenté, la première chose et la plus importante à faire, l'environnement fournit des lignes directrices XCode (Nice) pour améliorer la convivialité et legginilità dans le développement. Une d'elles est la directive #pragma mark qui devient très utile dans l'organisation de groupes de code et des méthodes.
Dans l'image ci-dessous vous pouvez voir la partie de code de mon projet PragmaTest :

Le menu du haut déroulant vous permet de lister toutes les méthodes de notre classe. Maintenant, si nous insérons notre méthode sur la directive #pragma mark qui a une syntaxe:
1 | Marque # pragma {label} |
Nous obtenons:

La première #pragma mark avec un tiret (-) insère une ligne de séparation. Le second est un texte (étiquette) au goût. Vous pouvez ajouter la déclaration suivante où vous voulez, en organisant le code comme bon vous semble. Vous pouvez entrer des lignes plus pragmatique, tapez:
1 2 3 4 5 6 | Marque # pragma - # Pragma mark / ** # * Mark Pragma utilisant le pragma # * Mark Pragma sur plusieurs lignes de code # Pragma mark * / void ) mioMetodo { } - (Void) {} myMethod |
Apple iPhone: la première version 1.2

Disponible sur l'AppStore la mise à jour de la version 1.2 de la Première . Voici les notes de version:
- Entièrement révisée tout au long des graphismes du jeu, qui est maintenant beaucoup plus agréable
- Compatible avec Apple iPhone 3.0
- Effets sonores ajoutés
- Révisé et amélioré la navigabilité du jeu et des instructions
iPhone: toutes les polices du système
L'iPhone d'Apple offre un nombre limité de polices pour les développeurs. La liste des polices disponibles est facilement réalisé par le code, comme nous le verrons. Si vous souhaitez utiliser vos propres polices, comme en l'incluant dans les ressources, il est un peu plus articulé et conivolge également la délivrance des licences (droits) des polices "embed" ... nous allons parler plus tard. Se tournant plutôt vers les sources officielles présentes dans l'iPhone, ils sont (cliquez sur l'image pour agrandir):
L'Apple iPhone SDK fournit un accès aux polices système spécial. Ils sont identifiés par des constantes particulières et sont les suivants:
1 2 3 | [ UIFont boldSystemFontOfSize : 12.0 ] ; UIFont myBoldFont * = [UIFont boldSystemFontOfSize: 12.0]; [ UIFont SystemFontOfSize : 12.0 ] ; UIFont mySystemFont * = [UIFont SystemFontOfSize: 12.0]; [ UIFont italicSystemFontOfSize : 12.0 ] ; UIFont myItalicFont * = [UIFont italicSystemFontOfSize: 12.0]; |
Si vous obtenez en fait un pointeur sur une Odei polices affiché dans l'image ci-dessus il suffit d'utiliser:
1 | [ UIFont fontWithName : @ "Helvetica-Bold" size : 22.0 ] ; UIFont myCustomFont * = [fontWithName UIFont: @ "Helvetica-Bold" taille: 22.0]; |
Comme vous pouvez voir la direction de la police est spécial, en plus de la famille (Helvetica, Courier, etc ...) doit préciser le type (gras, italique, etc ...). En pratique, donc, une police doit être équipé avec ces caractéristiques. L'Helvetica, par exemple, est représentée par:
1 2 3 4 | Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique |
Si vous souhaitez afficher vos polices directement sur l'iPhone, voici quelques lignes de code utiles:
1 2 3 4 5 6 7 8 9 10 11 12 | listOfFonts = [ [ NSArray alloc ] initWithArray : [ UIFont familyNames ] ] ; NSArray * listOfFonts = [[ NSArray alloc] initWithArray: [UIFont familyNames]]; subFontTypes; NSArray * subFontTypes; int i = 0 ; i< [ listOfFonts count ] ; i ++ ) { for (int i = 0; i <[listOfFonts count]; i + +) { "Font Family: %@" , [ listOfFonts objectAtIndex : i ] ) ; NSLog (@ "famille de polices:% @", [objectAtIndex listOfFonts: i]); NSArray alloc ] initWithArray : [ UIFont fontNamesForFamilyName : [ listOfFonts objectAtIndex : i ] ] ] ; subFontTypes = [[ NSArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [objectAtIndex listOfFonts: i]]]; int j = 0 ; j< [ subFontTypes count ] ; j ++ ) { for (int j = 0 j <[subFontTypes count] j + +) { "+----->Type: %@" , [ subFontTypes objectAtIndex : j ] ) ; NSLog (@ type "+----->:% @ ", [objectAtIndex subFontTypes: j]); } ; [Communiqué de SubFontTypes]; } ; [ListOfFonts release]; |
Avec le SDK 2.2.1 sur mon simulateur, j'ai obtenu:
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 73 | Famille de polices: Courier Tapez +----->: Courier Tapez +----->: Courrier-BoldOblique Tapez +----->: Courier-Oblique Tapez +----->: Courier-Bold Famille de polices: AppleGothic Tapez +----->: AppleGothic Famille de polices: Arial Tapez +----->: ArialMT +-----> Type: Arial-BoldMT +-----> Type: Arial-BoldItalicMT +-----> Type: Arial-ItalicMT Famille de polices: sthe TC Tapez +----->: Light-STHeitiTC +-----> Type: moyen STHeitiTC Famille de polices: Hiragino Kaku Gothic Pron Tapez +----->: HiraKakuProN-W6 Tapez +----->: HiraKakuProN-W3 Famille de polices: Courier New Tapez +----->: CourierNewPS-BoldMT Tapez +----->: CourierNewPS-ItalicMT Tapez +----->: CourierNewPS-BoldItalicMT Tapez +----->: CourierNewPSMT Famille de polices: Zapfino +-----> Type: Zapfino Famille de polices: Arial Unicode MS Tapez +----->: ArialUnicodeMS Famille de polices: sthe SC Tapez +----->: Moyen-STHeitiSC Tapez +----->: Light-STHeitiSC Famille de polices: American Typewriter Tapez +----->: AmericanTypewriter Tapez +----->: AmericanTypewriter-Gras Famille de police: Helvetica +-----> Type: Helvetica-Oblique +-----> Type: Helvetica-BoldOblique +-----> Type: Helvetica Tapez +----->: Helvetica-Bold Famille de polices: feutre Tapez +----->: Thin-MarkerFelt Famille de police: Helvetica Neue Tapez +----->: HelveticaNeue +-----> Type: HelveticaNeue-Gras Famille de polices: DB LCD Temp Tapez +----->: DBLCDTempBlack Famille de polices: Verdana +-----> Type: Verdana-Gras Tapez +----->: Verdana-BoldItalic +-----> Type: Verdana Tapez +----->: Verdana-italique Famille de police: Times New Roman Tapez +----->: TimesNewRomanPSMT Tapez +----->: TimesNewRomanPS-BoldMT Tapez +----->: TimesNewRomanPS-BoldItalicMT Tapez +----->: TimesNewRomanPS-ItalicMT Famille de polices: la Géorgie +-----> Type: Georgia-Gras +-----> Type: Géorgie +-----> Type: Georgia-BoldItalic +-----> Type: Georgia-italique Famille de polices: sthe J +-----> Type: moyen STHeitiJ +-----> Type: Light-STHeitiJ Famille de polices: Arial Rounded MT Bold Tapez +----->: ArialRoundedMTBold Famille de polices: Trebuchet MS Tapez +----->: TrebuchetMS-italique Tapez +----->: TrebuchetMS +-----> Type: Trébuchet-BoldItalic Tapez +----->: TrebuchetMS-Gras Famille de polices: sthe K Tapez +----->: Moyen-STHeitiK Tapez +----->: Light-STHeitiK |
Comment supprimer NSLog () de la source XCode
<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> une fonction utile durant les premiers stades d'un projet pour tester et déboguer une application pour iPhone d'Apple ou, plus généralement, dans l'environnement XCode. Etre juste une fonction, tout comme les autres, sa présence se fera sentir, même lors de la publication (release) de notre exécutable. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Il devient alors nécessaire d'enlever, d'une certaine façon, toutes les lignes de NSLog() de notre code, car il n'est plus nécessaire, et parce que les appels à NSLog() pourrait affecter les performances de notre application, surtout si nous mettons NSLog() à la «boucle interne.
Immédiatement écarter la solution au "look" et "annuler" parce qu'un jour il pourrait être utilisé à nouveau. Nous excluons la solution du «look» et «commentaires», inconfortable pour la même raison que précédemment. Heureusement, une. Propre, simple, et en utilisant le compilateur correct conditionnelles Ce que nous ferons, dans la pratique, et dire au compilateur d'exclure - s'il ya une condition spécifique - lors de la compilation de nos lignes source qui contiennent NSLog() .
Les directives de compilation et des déclarations de compilation conditionnelle, sont un outil très puissant et très répandue. Ceux venant de l'élaboration de la norme ANSI-C connaît très bien et sera certainement utilizzte dans de nombreuses situations. La particularité de ces «instructions» réside dans le fait, mentionné plus haut, pour être vu par le compilateur et non exécutable. Cette caractéristique les rend utiles dans de nombreux cas et peut résoudre les problèmes par ailleurs très agaçant.
Voyons un exemple de code qui, comme prévu, vous pouvez "supprimer" de la compilation du partage de code, dans notre cas NSLog() :
1 2 3 4 5 6 | # Définir une ACTIVE_NSLOG / / Si la constante est définie ACTIVE_NSLOG remplissez / / Le bloc de code entre # ifdef et # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
). Les instructions conditionnelles font partie de la compilation de la même famille que #define , également, en fait, sont précédés d'un "livre" ( # ). solo se ACTIVE_NSLOG è definito. Dans l'exemple montré que nous avons défini une constante ACTIVE_NSLOG ; lignes de code indique au compilateur de ligne "include" NSLog() que si ACTIVE_NSLOG est défini. Si nous avons pris soin, lors de la rédaction de notre code, de placer des appels à NSLog() dans le bloc #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , il suffit de supprimer la définition de la constante ACTIVE_NSLOG à disparaître, la prochaine compilation, tous nos NSLog() .
Une meilleure et finale
Voyons maintenant comment configurer l'environnement XCode pour améliorer encore plus ce que nous avons fait ici! Tout d'abord nous choisissons un nom de constante que nous utilisons dans nos projets d'exclure de la compilation NSLog() . o quello che preferite. Vous pouvez choisir le nom que vous voulez, à partir DEBUG au MIO_DEBUG ou ce que vous préférez. Ouvrez votre projet, neuf ou ancien. Entrez toutes les NSLog() dans le bloc (ou bloc):
1 2 3 | # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
Sélectionnez le fichier principal de votre projet, cliquez sur le bouton droit et choisissez l'option Get Info.

Ceci ouvre la fenêtre avec des informations sur le projet:

Sélectionnez l'onglet Générer, vérifiez que vous êtes dans la configuration Debug (ce qui est le joyau), allez à la section utilisateur et d'ajouter, via le bouton en bas à gauche, un nouveau champ appelé OTHER_CFLAGS . A cette valeur assegnamoli -DMIO_DEBUG=1 . La syntaxe est -D{mia define}=1 .
Cette procédure a deux avantages:
- Nous ne devons pas mettre dans le code
#define MIO_DEBUG 1, mais nous le faisons à travers les informations du projet. Alors, quand nous allons à remplir la version (l'un sans l'NSLog()) n'ont pas à se rappeler pour supprimer la ligne#define MIO_DEBUG 1 - La constante est définie par rapport à la configuration, dans notre cas de débogage. Ainsi, le passage à la version de configuration (communiqué) seront absents et les rangées constante avec
NSLog()ne sera pas compilé
Conclusions
La procédure ci-dessus peut être utile dans un cas moltidutine autre, avec NSLog() , n'ont rien à faire. Les instructions conditionnelles peuvent aider le compilateur dans un large éventail de contextes. Ils sont souvent utilisés par les programmeurs pour déterminer le type de système d'exploitation, la version, la cible, la présence de processeurs mathématiques, tout en conservant le même "même" source.
Pour comprendre, par exemple, nous pouvons utilizzre notre constante MIO_DEBUG également intervenir dans d'autres domaines du code:
1 2 3 4 5 6 7 8 9 10 | / / Debug s'ils gagnent le match / / Avec un score de 100 au lieu de 10 000:) # Ifdef MIO_DEBUG score == 100 ) if (score de == 100) # Else score == 10000 ) if (score de == 10000) # Endif { ; [HaiVinto auto]; } |
Pour finir, voici quelques exemples et des variantes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | / / En général, il ya # Si l'expression / / Si la déclaration semblable à la traditionnelle, donc avec une pleine expression / / Vérifier si une constante est définie # Ifdef constante / / Vérifier si ce n'est pas une constante définie # Ifndef constante / / Else # Else / / Fermer le bloc # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / Par exemple ... # Define DEBUG 1 5 # define MIA_ALTRA_COSTANTE ... # Si DEBUG / / Remplissez ce # Else / / Sinon remplissez cet autre # Endif # Si MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4 | # Ifndef INCLUDE_MIO_FILE # Définir INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |








Derniers Commentaires
Mark : @ Marc: Merci pour la réponse. Par exemple, si vous avez un code de sauvegarder / utiliser le dossier ...
Mark : Merci pour la réponse. Par exemple, si vous avez un code de sauvegarder / utiliser le dossier ...
Giovambattista Fazioli : @ Marc: en principe, absolument, beaucoup dépend de comment et quoi télécharger. La. ..
Mark : Bonjour, bon guide! Je voulais vous demander, vous pouvez utiliser le même code à exécuter une base de données SQL? Au lieu de ...
Joseph : Salut je voulais vous demander comment vous pouvez faire dans le post que j'ai téléchargé une galerie de 50 images, par exemple, ...