Archives Juillet 2009


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 pratique: 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 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.

Suite ...

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 () nous trouvons:

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é ... :)

Suite ...

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.

Suite ...

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:

xcode-preferences

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.

Suite ...

iPhone: étendre une classe UIView

creato. Je veux montrer comment vous pouvez facilement et rapidement étendre une classe UIView d'une manière qui répond à une nouvelle méthode d'initialisation contient du code supplémentaire pour personnaliser l'objet UIView créé. Comme certains d'entre vous le savez probablement, Objective-C ne supporte pas un seul fabricant comme dans les langages orientés objet d'autres (comme Adobe ActionScript ou PHP 5). Il peut, en effet, créer une instance d'une classe appelant manuellement différents fabricants (virtuellement infini). . Normalement nous sommes habitués à créer des objets UIView avec le classique initWithFrame . Mais imaginez que vous souhaitez créer une nouvelle classe d'objets visuels, à partir d'un UIView , avec quelques ajouts, comme une étiquette intégrée. . Fondamentalement, ce que nous voulons, c'est que l'instanciation de notre objet qu'il crée, ainsi que les 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 appeler 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 oeuvre ViewLabel

id ) initWithFrame : ( CGRect ) frame { - (Id) initWithFrame: (CGRect) frame {

self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: IMAGE]) {
/ / Initialisation du code
}
le retour de soi;
}

/ /
/ / Notre nouvelle initialiseur
/ /
id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine { - (Id) initWithLabelDefine: étiquette d'image (CGRect): ( NSString *) {labelDefine

self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: IMAGE]) {
/ / Ici vous pouvez décider quoi faire, 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: cadre];
internalLabel.text = labelDefine;
internalLabel ] ; [Self addSubview: internalLabel];
; [InternalLabel release];
}
le retour de soi;
}

void ) drawRect : ( CGRect ) rect { - (Void) drawRect: (CGRect) rect {
/ / Dessin du code
}

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"];

Suite ...

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:

newproject

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:

deleteib

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.

Suite ...

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 :

pragmamark-1

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:

pragmamark-2

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

Suite ...

Très court astuce: WordPress, mettre en évidence les résultats d'une recherche

Il existe plusieurs plugins pour WordPress qui permettent d'améliorer les caractéristiques et les performances de la "Recherche". Presque tous les plugins disponibles ont une des conditions intéressantes et utiles fonction de surbrillance de recherche dans le résultat de la recherche. Si vous ne prévoyez pas encore appensantire votre installation de WordPress, mais ne veulent pas renoncer à tout pour une fonction similaire, voici comment implémenter facilement une «Faits saillants» des termites dans les résultats de recherche.

Suite ...

Très court astuce: WordPress, exclus de pages de recherche et post

L'intérieur du moteur de WordPress utilisés pour la recherche (la norme sans l'ajout de plug-in) effectue un classique de bas niveau query_post() . La recherche est dapperttutto sans exclusion. Cette fonctionnalité peut être contrôlé, cependant, permettant, par exemple, pour rechercher tous les cours sauf dans des catégories spéciales, pages ou messages.

Suite ...

Apple iPhone: la première version 1.2

thefirst12claim

appstore-60

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

Suite ...



Arrêtez SOPA