L’objective C

         1 – Une petite présentation

    Je suis tombé par hasard sur un petit bijou sur Google Code : http://code.google.com/p/oscompiler/ : OSCOMPILER, un compilo Objective-C codé en .Net (v°4).
L’installation est simplissime :

Télécharger : http://code.google.com/p/oscompiler/downloads/detail?name=OSCv0.1.4.zip
Dézipper : vous obtenez 2 fichiers : osc.exe, OSRuntime.dll
Installation terminée !
Maintenant, nous allons tester : créer un fichier hello.m (dans le même répertoire) et saisir le code ci-dessous :

Code objc

#import

@interface Main : NSObject { }
@end

@implementation Main
+(void)main {
NSString *mystring = @ »Hello world ! »;
NSLog(@ »mystring : %s »,mystring );
}
@end

Sauvegarder
Lancer la commande : osc hello.m
Vous obtenez une exécutable hello.exe …
… que vous pouvez lancer … Et ça fonctionne
à vous les joies de l’Objective-C sur un net-book, une période d’interco trop longue, …

         2 – Continuons 🙂

    Vous avez craqué, acheté un Mac, c’est beau. Plein de bonnes résolutions, vous avez souhaité vous investir dans la programmation Objective C et Cocoa pour faire la « killer app » sous OSX.

1ère étape : Objective-C …, ouups !!! : des pointeurs, une notation bizarroïde avec de crochets partout, mais ils sont où les crochets sur le clavier !?! (ndrl : shift+alt+( ou ) ).
Une fois passé ce choc culturel, et avoir codé votre « hello world !!! » en mode console, c’est le grand jour, passage à l’IHM graphique avec Cocoa.
Sous XCode (l’ide d’Apple) pour créer des IHM, l’outil par excellence est Interface Builder, que tous les programmeurs sous OSX (qui sont tombés dedans petits) estiment être THE outil.

2ème étape : Interface Builder : alors là, c’est le drame, vous étiez habitué à Visual Studio et ses Winforms (je pose un bouton sur mon écran, je double-click dessus, je saisi mon code, emballé c’est pesé, ça fonctionne), mais non chez Apple, ils ont pensé leur outil pour que le développeur Windows reste un développeur Windows.
Pas grave, avec courage, vous avez fait les tutos sur le net, investi dans un bouquin sur Cocoa en anglais … puis en français. Mais non, la révélation n’est pas venue (vous vous êtes déjà « cogné » Objective-C, faut pas pousser …).
Je dis « Vous », mais en fait c’est mon histoire.

Mais, je/vous suis/êtes têtu(s). Par hasard je suis tombé sur un article expliquant comment créer des objets graphiques dynamiquement, donc la nouvelle, c’est qu’il est possible de créer une IHM Mac sans Interface Builder. Je vous explique mon interprétation …

Lancez XCode
Créez un nouveau projet « tutococoa » de type « Cocoa Application »
Une fois le projet créer, dans l’arborescence vous allez avoir plusieurs fichiers dont :
tutococoaAppDelegate.m
tutococoaAppDelegate.h
..
Allez faire un tour dans tutococoaAppDelegate.m
Nous allons créer un bouton et un champ texte dans notre fenêtre principale, saisissez donc le code suivant :

Code objc

//
// tutococoaAppDelegate.m
// tutococoa
//

#import « tutococoaAppDelegate.h »

@implementation tutococoaAppDelegate

@synthesize window;

NSTextField *myTextField;
NSButton *myButton;

– (void)applicationDidFinishLaunching NSNotification *)aNotification {

//déplacer et changer la taille de la fenêtre principale
[self.window setFrame:NSMakeRect(110,110,320,200) display:YES animate:YES];
//déplacer et changer la taille de la vue dans la fenêtre principale
[self.window.contentView setFrame:NSMakeRect(0,0,320,200)];

//créer un bouton
myButton = [[NSButton alloc] initWithFrame: NSMakeRect(10, 130, 90, 50)];
//changer le style du bouton
myButton.bezelStyle = NSRoundedBezelStyle;
//changer le titre du bouton
myButton.title = @ »HELLO »;
//ajouter le bouton à la vue
[self.window.contentView addSubview: myButton];

//créer un champ texte
myTextField = [[NSTextField alloc] initWithFrame: NSMakeRect(110, 144, 150, 24)];
//changer le texte du champ texte
myTextField.stringValue = @ »HELLO … »;
//ajouter le bouton à la vue
[self.window.contentView addSubview: myTextField];

}
@end
Compilez, lancez, et …

… Bienvenue dans le monde des développeurs COCOA 😉
Et maintenant, nous allons faire bosser notre bouton :
Nous voulons donc associer une action à notre bouton, pour cela, éditer le fichier header tutococoaAppDelegate.h, dans lequel nous devons tout d’abord déclarer notre action :

Code objc

//
// tutococoaAppDelegate.h
// tutococoa
//

#import

@interface tutococoaAppDelegate : NSObject {
NSWindow *window;
}

//Déclaration de mon action
– (IBAction)buttonClicked id)sender;

@property (assign) IBOutlet NSWindow *window;

@end
Nous retournons ensuite dans tutococoaAppDelegate.m, où nous allons coder notre action et l’associer à notre bouton. Modifiez le code de la manière suivante :

Code objc

//
// tutococoaAppDelegate.m
// tutococoa
//

#import « tutococoaAppDelegate.h »

@implementation tutococoaAppDelegate

@synthesize window;

NSTextField *myTextField;
NSButton *myButton;

– (void)applicationDidFinishLaunching NSNotification *)aNotification {

//déplacer et changer la taille de la fenêtre principale
[self.window setFrame:NSMakeRect(110,110,320,200) display:YES animate:YES];
//déplacer et changer la taille de la vue dans la fenêtre principale
[self.window.contentView setFrame:NSMakeRect(0,0,320,200)];

//créer un bouton
myButton = [[NSButton alloc] initWithFrame: NSMakeRect(10, 130, 90, 50)];
//changer le style du bouton
myButton.bezelStyle = NSRoundedBezelStyle;
//changer le titre du bouton
myButton.title = @ »HELLO »;
//ajouter le bouton à la vue
[self.window.contentView addSubview: myButton];

//– AJOUT DE CODE —
//Associer l’action buttonClicked à myButton
[myButton release];
myButton.target = self;
myButton.action = @selector(buttonClicked ;
//– FIN AJOUT DE CODE —

//créer un champ texte
myTextField = [[NSTextField alloc] initWithFrame: NSMakeRect(110, 144, 150, 24)];
//changer le texte du champ texte
myTextField.stringValue = @ »HELLO … »;
//ajouter le bouton à la vue
[self.window.contentView addSubview: myTextField];

}

//– AJOUT DE CODE —
//Afficher Hello World ! dans le champ text si on click sur le bouton
– (IBAction) buttonClicked: (id)sender
{
[myTextField setStringValue: @ »Hello World ! »];
}
//– FIN AJOUT DE CODE —

@end
Compilez, lancez, et clickez sur le bouton et …

… ça marche !
Voilà, vous remarquerez que le système de coordonnées est particulier (le même qu’en math à l’école) et que je ne maîtrise pas encore le positionnement, mais ça vous laisse de quoi tester (si vous découvrez des « tips » je suis bien sûr preneur).
Dès que je trouve comment créer d’autres éléments graphiques, je posterais un « code snippet ».
Prochainement, nous verrons comment faire la même chose pour iPhone & iPad.