Nib2objc: Ou comment convertir un nib en code Objectif-C
L’utilisation d’Interface Builder s’avère très pratique pour les développeurs Cocoa Touch. C’est vrais que c’est génial de pouvoir créer ses interfaces en mode WYSIWYG. Oui mais voilà, cela peut poser quelques problèmes. Outre les cas où l’utilisation du code est nécessaire (pour atteindre la granularité voulue), on peut vouloir renoncer à l’utilisation des nibs pour des raisons de performance.
En effet, dans certains cas l’utilisation des nibs pose de sérieux problèmes de performance. On se retrouve ainsi avec un dur choix: soit on choisit la simplicité (et on utilise Interface Builder), soit on écrit ses interfaces directement dans le code et on gagne en performance. Dans certains cas, l’impact de l’utilisation des nibs sur la performance est quasi nul. La question ne se pose donc pas. Mais parfois, ce n’est pas le cas.
Dans ce dernier cas de figure, il existe maintenant une solution: nib2objc. Ce projet Open-Source est tout simplement un convertisseur de fichiers nib (.xib) vers du code Objectif-C. Il gère toutes les propriétés publiques de chacun des éléments graphiques, le constructeur et la hiérarchie des vues. Pour le moment, il n’y a que les composants d’UIKit qui sont supportés. L’utilisation est on-ne-peut-plus simple:
imac-de-julien-2:Debug julien$ ./nib2objc demo.xib > demo.m
Et voilà le résultat pour ce nib:
UILabel *view6 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 20.0, 260.0, 21.0)];
view6.frame = CGRectMake(20.0, 20.0, 260.0, 21.0);
view6.adjustsFontSizeToFitWidth = YES;
view6.alpha = 1.000;
view6.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
view6.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
view6.clearsContextBeforeDrawing = YES;
view6.clipsToBounds = YES;
view6.contentMode = UIViewContentModeScaleToFill;
view6.enabled = YES;
view6.font = [UIFont fontWithName:@"Helvetica" size:17.000];
view6.hidden = NO;
view6.lineBreakMode = UILineBreakModeTailTruncation;
view6.minimumFontSize = 10.000;
view6.multipleTouchEnabled = NO;
view6.numberOfLines = 1;
view6.opaque = NO;
view6.shadowOffset = CGSizeMake(0.0, -1.0);
view6.tag = 0;
view6.text = @"Ma célule personalisée";
view6.textAlignment = UITextAlignmentCenter;
view6.textColor = [UIColor colorWithRed:0.000 green:0.000 blue:0.000 alpha:1.000];
view6.userInteractionEnabled = NO;
UITableViewCell *view4 = [[UITableViewCell alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 182.0) reuseIdentifier:(null)];
view4.frame = CGRectMake(0.0, 0.0, 300.0, 182.0);
view4.accessoryType = UITableViewCellAccessoryNone;
view4.alpha = 1.000;
view4.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
view4.backgroundColor = [UIColor colorWithRed:1.000 green:1.000 blue:1.000 alpha:1.000];
view4.clearsContextBeforeDrawing = NO;
view4.clipsToBounds = NO;
view4.contentMode = UIViewContentModeScaleToFill;
view4.font = [UIFont fontWithName:@"Helvetica" size:17.000];
view4.hidden = NO;
view4.hidesAccessoryWhenEditing = YES;
view4.indentationLevel = 0;
view4.indentationWidth = 10.000;
view4.lineBreakMode = UILineBreakModeTailTruncation;
view4.multipleTouchEnabled = NO;
view4.opaque = YES;
view4.selectedTextColor = [UIColor colorWithWhite:1.000 alpha:1.000];
view4.selectionStyle = UITableViewCellSelectionStyleBlue;
view4.showsReorderControl = NO;
view4.tag = 0;
view4.textAlignment = UITextAlignmentLeft;
view4.textColor = [UIColor colorWithWhite:0.000 alpha:1.000];
view4.userInteractionEnabled = YES;
UIButton *view7 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
view7.frame = CGRectMake(101.0, 49.0, 99.0, 37.0);
view7.adjustsImageWhenDisabled = YES;
view7.adjustsImageWhenHighlighted = YES;
view7.alpha = 1.000;
view7.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
view7.clearsContextBeforeDrawing = NO;
view7.clipsToBounds = NO;
view7.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
view7.contentMode = UIViewContentModeScaleToFill;
view7.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
view7.enabled = YES;
view7.font = [UIFont fontWithName:@"Helvetica-Bold" size:15.000];
view7.hidden = NO;
view7.highlighted = NO;
view7.multipleTouchEnabled = NO;
view7.opaque = NO;
view7.reversesTitleShadowWhenHighlighted = NO;
view7.selected = NO;
view7.showsTouchWhenHighlighted = NO;
view7.tag = 0;
view7.titleShadowOffset = CGSizeMake(1.0, 1.0);
view7.userInteractionEnabled = YES;
[view7 setTitle:@"Un bouton" forState:UIControlStateNormal];
[view7 setTitleColor:[UIColor colorWithWhite:1.000 alpha:1.000] forState:UIControlStateHighlighted];
[view7 setTitleColor:NSPatternColorSpace NSImage 0x2c3e5a0 Size={320, 460} Reps=(
NSBitmapImageRep 0x2c49460 Size={320, 460} ColorSpace=NSDeviceRGBColorSpace BPS=8 BPP=32 Pixels=320x460 Alpha=YES Planar=NO Format=1
) forState:UIControlStateNormal];
[view7 setTitleShadowColor:NSNamedColorSpace System controlColor forState:UIControlStateNormal];
UISwitch *view8 = [[UISwitch alloc] initWithFrame:CGRectMake(103.0, 103.0, 94.0, 27.0)];
view8.frame = CGRectMake(103.0, 103.0, 94.0, 27.0);
view8.alpha = 1.000;
view8.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
view8.clearsContextBeforeDrawing = YES;
view8.clipsToBounds = YES;
view8.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
view8.contentMode = UIViewContentModeScaleToFill;
view8.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
view8.enabled = YES;
view8.hidden = NO;
view8.highlighted = YES;
view8.multipleTouchEnabled = YES;
view8.on = YES;
view8.opaque = NO;
view8.selected = NO;
view8.tag = 0;
view8.userInteractionEnabled = YES;
[view4 addSubview:view6];
[view4 addSubview:view7];
[view4 addSubview:view8];
Comme vous pouvez le voir, c’est très verbeux. C’est parce que l’outil ne détecte pas les valeurs qui sont là par défaut. Donc dans le doute, il génère toutes les propriétés. A noter aussi que les valeurs des propriétés UIImage, NSLocale et NSTimeZone ne sont pas sorties dans le code. En effet, ibtool (sur lequel nib2objc se base) ne les supporte pas.
Plus d’informations sur la page du projet nib2objc du site d’Adrian Kosmaczewski.

Adrian a écrit
le 16 juin 2009 à 16:38
Merci pour l’article!
Je vais publier une update bientot avec les proprietes propres a l’OS 3.0… des que le NDA sera tombe
Julien Quéré a écrit
le 17 juin 2009 à 13:42
Niquel
Je suis impatient de pouvoir utiliser cette nouvelle version.
Je te l’avoue, j’utilise fréquemment ton outil au travail ! Merci …