[résolu]projet empty application

LINKLINK Membre
juillet 2014 modifié dans API UIKit #1

Bonjour,

je me suis remis à  Xcode après un long moment d'inactivité :)


 


et je galère depuis la mise à  jour Xcode 5.1, plus de possibilité de faire un projet "empty application" avec des xib, et je ne souhaite pas utiliser stoyboard.


 


je m'explique, partant d'un projet "Empty application" et je souhaite afficher des vues.


 


voici comment je procède :


 


AppDelegate.m



#import "AppDelegate.h"
#import "Home.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];

Home *home = [[Home alloc] initWithNibName:@Home bundle:nil];
self.window.rootViewController = home;


[self.window makeKeyAndVisible];
return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end


ma vue Home.m



#import "Home.h"

@implementation Home

-(void)viewDidLoad
{
[super viewDidLoad];
[self setTitle:(@ACCUEIL)];
[self start];
}


-(void)start
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
label.text = @TEST;

[self.view addSubview:label];
}

@end


et voici mon débug console



1/Applications/F83627DB-1E72-4144-9E67-487F98E7795E/videos.app> (loaded)' with name 'Home''
*** First throw call stack:
(
0 CoreFoundation 0x017ec1e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x0156b8e5 objc_exception_throw + 44
2 CoreFoundation 0x017ebfbb +[NSException raise:format:] + 139
3 UIKit 0x004e0b7b -[UINib instantiateWithOwner:options:] + 951
4 UIKit 0x003496f5 -[UIViewController _loadViewFromNibNamed:bundle:] + 280
5 UIKit 0x00349e9d -[UIViewController loadView] + 302
6 UIKit 0x0034a0d3 -[UIViewController loadViewIfRequired] + 78
7 UIKit 0x0034a5d9 -[UIViewController view] + 35
8 UIKit 0x0026a267 -[UIWindow addRootViewControllerViewIfPossible] + 66
9 UIKit 0x0026a5ef -[UIWindow _setHidden:forced:] + 312
10 UIKit 0x0026a86b -[UIWindow _orderFrontWithoutMakingKey] + 49
11 UIKit 0x002753c8 -[UIWindow makeKeyAndVisible] + 65
12 videos 0x00002acb -[AppDelegate application:didFinishLaunchingWithOptions:] + 715
13 UIKit 0x0022514f -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 309
14 UIKit 0x00225aa1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1810
15 UIKit 0x0022a667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
16 UIKit 0x0023ef92 -[UIApplication handleEvent:withNewEvent:] + 3517
17 UIKit 0x0023f555 -[UIApplication sendEvent:] + 85
18 UIKit 0x0022c250 _UIApplicationHandleEvent + 683
19 GraphicsServices 0x037e1f02 _PurpleEventCallback + 776
20 GraphicsServices 0x037e1a0d PurpleEventCallback + 46
21 CoreFoundation 0x01767ca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
22 CoreFoundation 0x017679db __CFRunLoopDoSource1 + 523
23 CoreFoundation 0x0179268c __CFRunLoopRun + 2156
24 CoreFoundation 0x017919d3 CFRunLoopRunSpecific + 467
25 CoreFoundation 0x017917eb CFRunLoopRunInMode + 123
26 UIKit 0x00229d9c -[UIApplication _run] + 840
27 UIKit 0x0022bf9b UIApplicationMain + 1225
28 videos 0x00002e2d main + 141
29 libdyld.dylib 0x01e33701 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)  

je veux juste testé quelques petites choses, et malheureusement je ne décolle pas, j'ai des plantages et rien ne s'affiche.


 


Je fait quoi comme bêtise ? 


 


 


merci :)


Réponses

  • AliGatorAliGator Membre, Modérateur
    J'ai pas tout lu mais là  en 2 secondes je vois que tu fais un initWithNibName:@Home pour initialiser ton ViewController mais l'exception que tu as semble te dire qu'il ne trouve pas de Home.xib


    C'est sur que ça peut pas marcher du coup !


    Après j'ai pas lu ton code (je suis sur l'iPhone, pas pratique) j'ai juste lu 2 lignes donc c'est peut être pas ça mais bon je ne fais que lire ce que dit l'erreur en même temps...
  • iLandesiLandes Membre
    juillet 2014 modifié #3

    Salut


     


    L'erreur est dans cette ligne (bien plus lisible sur MacBook ^^)



    Home *home = [[Home alloc] initWithNibName:@Home bundle:nil];

    Tout d'abord il faut que home soit un UIViewcontroller (qui contient et gère une view séparée ou pas)


     


    initWitNibName est utilisé pour les fichiers storyboard.


     


    Il te faut donc écrire dans le appdelegate :



    Home *home = [[Home alloc] init];
    [myWindow setRootViewController:home];


    Mais bien sur il te faut créer home avec un .h du genre



    #import <UIKit/UIKit.h>

    @interface Home : UIViewController

    @property (nonatomic) UISearchBar* searchBar;


    Après faut décire ton viewcontroller ainsi que ses view


     


    Bon courage


     


    s


    e


    b


  • LINKLINK Membre
    juillet 2014 modifié #4

    bonjour,


     


    Effectivement je comprends mon erreur s'étais bien du au fait que je n'utilisais pas de .xib


    Une fois mon AppDelegate rectifié tout fonctionne ;)




    Home *home = [[Home alloc] init];
    self.window.rootViewController = home;

    Merci AliGator et surtout merci à  iLandes !


  • Joanna CarterJoanna Carter Membre, Modérateur

    Il y a une autre démarche. Dans tous les .xib se trouvent un objet File's Owner.


     


    Si tu sélectionnais cet objet et choisissais le Identity Inspector sur le panneau droit, tu pourrais saisir le nom de ta classe de view controller. Puis, tu connectes le File's Owner objet vers le view en choisissant le view property.


     


    Si tu voulais que le view controller soit delegate pour le view, tu pourrais connecter du view vers le File's Owner en choisissant le delegate property.


     


    Désormais, tu peut utiliser le code suivant pour créer le view controller et son view au même moment



    {
    ...

    HomeViewController *homeViewController = [[HomeViewController alloc] initWithNibName:@Home];

    ...
  • LINKLINK Membre
    juillet 2014 modifié #6

    Merci pour cette explication :)


    cependant tout mon soucis résidais dans le fait, que volontairement je n'utilise pas de .xib ;)


     


    Je créais toujours des projets vide et je code TOUT à  la main.


     


    Depuis Xcode 5 (donc aussi la version 6..) plus possible de créer une "Empty application" puis ensuite de créer via new file cocoa class des .xib ! c'est soit storyboard (single view application) soit  "Empty Application"...


     


    Mais le jour ou Xcode 6 sera en version publique, là ... Je me tournerais ver ta réponse.


    Et nous n'aurons plus vraiment besoin des .xib.


     


    encore merci.


  • AliGatorAliGator Membre, Modérateur
    Ce ne sont que des templates. Par définition, ces templates ne sont que des modèles sur lesquels il se base lorsque tu crées un tout nouveau projet.

    Mais rien ne t'empêche de tout casser dans le projet qu'il t'a généré ;)

    - Par exemple tu peux choisir de créer un nouveau projet en choisissant le template "Empty Application" et ensuite faire "New File" et choisir de rajouter un fichier XIB. Ou de rajouter un Storyboard. Ou pas.

    - Ou encore tu peux choisir de créer un nouveau projet avec le template "Single View Application", qui va te créer un projet qui par défaut aura un storyboard, mais ensuite décider de supprimer ce fichier Storyboard, et à  la place de créer des fichiers XIB (bien sûr, penser à  changer dans le Info.plist pour indiquer que l'UI chargée automatiquement au lancement est on XIB et pas un Storyboard, en mettant le bon nom)


    Dans tous les cas ce ne sont que des modèles de projets, mais une fois le projet créé tu peux modifier tous les settings et l'orga et tout si ça te chante. Rien ne t'oblige à  utiliser les Storyboard même si tu as créé au début ton projet avec le template "Single View Application", ni à  coder ton UI à  la même même si tu as créé ton projet avec le template "Empty Application".
  • Joanna CarterJoanna Carter Membre, Modérateur


    cependant tout mon soucis résidais dans le fait, que volontairement je n'utilise pas de .xib ;)


     


    Je créais toujours des projets vide et je code TOUT à  la main.




     


    Il ne reste qu'une question - pourquoi ? C'est vraiment du boulot  :o


     




    Depuis Xcode 5 (donc aussi la version 6..) plus possible de créer une "Empty application" puis ensuite de créer via new file cocoa class des .xib ! c'est soit storyboard (single view application) soit  "Empty Application"...




     


    Mais je viens de le faire.


     


    1. Créer un Empty Application


     


    2. Ajouter un View Controller (en cochant Also add XIB file)


     


    3. Sélectionner le projet et verifier il n y a rien dans le Main Interface


     


    4. Ajouter le code suivant à  la méthode application:didFinishLaunchingWithOptions: dans le AppDelegate



    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    ViewController *viewController = [[ViewController alloc] initWithNibName:@ViewController bundle:nil];

    self.window.rootViewController = viewController;

    [self.window makeKeyAndVisible];

    return YES;
    }

    Tous ça ne m'a mis que une minute à  créer.


     


     




    Mais le jour ou Xcode 6 sera en version publique, là ... Je me tournerais ver ta réponse.


    Et nous n'aurons plus vraiment besoin des .xib.




     


    Pas du tout ! Moi, je suis en train de faire un grand projet qui, jusqu'à  présent, se compte de 13 storyboards et 78 XIB.


     


    Je crée les storyboards depuis les view controllers des XIB et vice versa.


     


    Comme AliGator a dit, il n'y a rien qui t'empêche d'utiliser ce que tu veux comme UI  ::)

  • LINKLINK Membre
    juillet 2014 modifié #9
    Ajouter un View Controller (en cochant Also add XIB file)

     


    la case est grisé chez moi !


    Donc, question,  je ne comprends pas comment TOI tu as bien put réussir  ::) ? 


    je suis sous Xcode Version 5.1.1 (5B1008) et c'est pas possible...


     


    Ensuite bien sur je peux modifier à  la main les fichiers, mais je parlais encore une fois depuis l'interface d'Xcode ;)


     


    Xode 6 libère de cette corvée des .xib, storyBoard et .xib ne sont pas pareil ?! Pourquoi avoir des .xib lol storyBoard est fait pour géré et centralisé tout... 


     


    Bref, chacun son avis sur la créa d'un projet vide ou assister.


  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2014 modifié #10


    la case est grisé chez moi !


    Donc, question,  je ne comprends pas comment tu as bien put réussir  ? 


    je suis sous Xcode Version 5.1.1 (5B1008)




     


    Pardon, j'ai manqué une étape. il faut saisir "UIViewController" dans la boà®te "Subclass of", puis on pourrait cocher la case.


  • LINKLINK Membre
    juillet 2014 modifié #11

    pas possible ;)


    224732Sanstitre.png


     


     


    Et avant qu'on me dise, "ben bien sure faut mettre un nom pour ta classe" ::)  ... cela ne change rien !


    Sous Xcode 4.6 là ... oui 


  • Joanna CarterJoanna Carter Membre, Modérateur

    Avec Version 5.1.1 (5B1008) ci-joint


     


    Comment arrives-tu à  ce dialog ? Quelles étapes ?


  • LINKLINK Membre
    juillet 2014 modifié #13

    dans le dossier de mon projet depuis Xcode :


     


    New file 


    Cocoa (*édit : donc, cocoa touch, du coup...)


    Objective-C class ->Next


     


    et tu arrives à  ma capture.


     


    curieux, tout ça.


     


    *édit :


     


    J'ai compris ma grossière erreur :


     


    Pff... j'étais dans l'onglet Mac Ox....  B)


    Merci pour ton aide ;)


  • Joanna CarterJoanna Carter Membre, Modérateur


    dans le dossier de mon projet depuis Xcode :


     


    New file 


    Objective-C class ->Next


     


    et tu arrives à  ma capture.


     


    curieux, tout ça.




     


    Vachement curieux ! Qu'est-ce que l'on peut dire ?


     


    Quand même, on peut créer d'abord un View Controller sans XIB, puis créer un XIB et saisir le nom de la classe View Controller sur l'objet File's Owner dans le XIB. ça mettrait un peut plus mais on arriverait au même résultat.

  • LINKLINK Membre
    juillet 2014 modifié #15

    si c'est ok ! j'avais édité, tout étais de ma faute...


    Merci beaucoup 


    ;)


  • Joanna CarterJoanna Carter Membre, Modérateur

    ça arrive  ::)  :D


  • du, coup j'ai appris plein de truc grace à  toi ;)


     


    merci


  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2014 modifié #18
    Je t'en prie
  • Joanna CarterJoanna Carter Membre, Modérateur


    Xode 6 libère de cette corvée des .xib, storyBoard et .xib ne sont pas pareil ?! Pourquoi avoir des .xib lol storyBoard est fait pour géré et centralisé tout... 




     


    On peut faire le même projet XIB avec Xcode 6 mais, actuellement, il faudrait supprimer le storyboard, et modifier le info.plist en supprimant le nom du storyboard. Après tout, ce n'est qu'un beta  :o

Connectez-vous ou Inscrivez-vous pour répondre.